Hasan Akpürüm
Kıdemli Yazılım Danışmanı
Makele Detayı

Entity Framework Change Tracker veri tabanında yapılan değişiklikleri birebir başka bir veri tabanında saklama

21.12.2018 16:45:54

Merhaba arkadaşlar,

Başlığımızdan’da anlaşılacağı üzere Entity Framework ’te veritabanı üzerinde yapılan insert,update,delete gibi işlemleri ChangeTracker ’dan yakalayarak farklı bir db ya da nosql db üzerinde tutmayı anlatmaya çalışacağım. Ben örnek olarak kayıtları birebir LiteDbüzerinde eşzamanlı bir şekilde tutacağım. Yani mssql üzerindeki bir değişiklik işlem başarılı ise bire bir LiteDb ye yansıyacak.

Boş bir console uygulaması açarak Database1 isimli local veri tabanımız üzerinde çalışacağız. Veritabanı neslelerimizi ve DbContext nesnelerimizi oluşturuyoruz.

Normal bir insert işlemimiz olduğunu düşünelim.

Şimdi bu kodumuzu biraz değiştirelim ve ChangeTracker ’ı takip edebileceğimiz hale getirelim.

Ve uygulamamızı Debug ederek Neler olup bittiğini inceleyelim.

SaveChanges den önce girdiği için PrimaryKey alanımızın değeri “0” ve Durumu Added olarak geldi. Devam edelim.

SaveChanges işlemimizden sonra Veritabanına insert edilen kayıt birebir geldi. Durumu ise Unchanged olarak göründü çün primary key değeri reference type olduğu için sadece değeri güncellendi.

 

Projemize Install-Package LiteDB komutu ile litedb reference ımızı ekleyelim. (LiteDb : Embedded NoSQL veritabanıdır. https://www.litedb.org/ )

DisplayTrackedEntities methodumuza gerekli koşullarımızı ekliyoruz.

 

LiteDbSync adında method açıp işlemi yapılan veriyi BSON verisine dönüştürerek LiteDb üzerinde veri eşitliğini sağlıyoruz.

Ve Debug ederek olanları görelim.

Aşağıdaki link üzerinden LiteDbViewer uygulamasını indirerek LiteDb verilerinizi izleyebilirsiniz. Buna benzer daha gelişmiş tool larda bulunmakta.

https://github.com/falahati/LiteDBViewer

c:/temp/DataBase1.db dizinimize giderek veri tabanımızı açıyoruz.

 

LiteDb

Burada Primary Key alanımız _id olarak görünsede aslında karşılığı sizin Person sınıfı ile map lendiğinde Id property nize denk gelicek o yüzden kafanızı karıştırmasın. _type olarak tuttuğu alan ise yine aynı şekilde sınıfınızın tipini tutuyor ama Person sınıfımızın property sinde olmadığı için işimize yaramayacak. Vermizin detayına baktığımızda mssql deki verimizle birebir aynı olduğunu görüyoruz.

MSSQL

 

Birde bu veriyi güncelleme işlemini gerçekleştirelim.

UpdatePerson adında bir method açıp çalıştırıyorum.

 

Lite Db

MSSQL

Mssql üzerinde güncellenen verimiz Litedb üzerinde’de güncelledi. Verimizi silerse aynı şekilde lite db üzerinde de silinecektir.

Ben örnek olarak Litedb kullandım siz isterseniz mongodb, isterseniz elasticsearch  vb. üzerinde verilerinizin bütünlüğünü sağlayabilirsiniz.

Umarım faydalı bir makale olmuştur.

 

Github

Yorum yaz

Thanks, your message is sent successfully.