Entity Framework Core Change Tracker nedir?
ASP.NET’te ORM(Object Relational Mapping) Framework olan Entity Framework’ü database işlemlerimizi kolayca halletmek için kullanıyoruz. Veritabanında değişiklik yapıp, yeni veriler ekleyeceğimiz veya olan veriyle ilgili yapacağımız değişikliklerden sonra bu framework’ten gelen SaveChanges methoduyla yaptığımız değişiklerin kaydedilmesini sağlıyoruz.
Peki nerede ne değişiklik yaptığımızı Entity Framework nasıl anlıyor?
İşte tam burada Change Tracker devreye giriyor. Tracker zaten iz sürücü anlamına gelmektedir. Change Tracker burada her bir nesneyi takip ettiği ve değişen olup olmadığını tuttuğu için SaveChanges methodu ile Change Tracker tarafından izi sürülen verilerden değişiklik yapılmış veriler database’e uygulanıyor. Yani bizim her nesnemiz takip ediliyor ve değişiklik yaptığımzda Change Tracker tarafından takip edildiği için değişiklik yapılmış veriler biliniyor oluyor. ve biz bu değişiklikleri artık kaydedebilirsin dediğimizde(SaveChanges metodu) de buradaki değişiklikler veri tabanımıza uygulanmış oluyor bu işlem bir verinin silinmesi, güncellenmesi veya yeni bir veri eklenmesi olabilir.
Entity Framework ile verilere erişip kullandığımızda bu veri tabanında olan, eklenecek veya güncellenecek her bir nesne bir state değerine sahiptir. Fotoğrafa dikkatli bakarsanız EntityState değerininin Detached olarak geldiğini görebilirsiniz.
Veri tabanında tuttuğumuz takip edilen her bir Entry(birim, varlık) yani her bir nesnenin bir state(durum) değeri tutuluyor bunlar; Detached, Modified, Deleted ve Added durumlarıdır. Burada Detached nesneyle alakalı hiçbir şey yapılmamışsa, added yeni bir nesne eklenmek istenmişse, modified nesne güncellenmişse ve deleted nesnenin silinmesi, anlamlarına gelir. Yukarıdaki örnek resimde de görebileceğiniz gibi veriye sadece eriştiğimiz için Detached durumunda.
Burada da ürünün ismi değiştirmek istendiği için artık entry state Modified oldu.
Her nesnemizin durumu ChangeTracker tarafından takip edildiği için yukarıda örneklendirdiğimiz verinin güncellenmesi ChangeTracker tarafından biliniyor. Ve biz SaveChanges() veya SaveChangesAsync() metodunu kullanınca aslında değişenler neler kardeşim, getir de bunları değiştirelim diyerek ChangeTracker tetiklenerek nesneler üzerinde yapılmış değişiklikleri veri tabanımıza uygulamış oluyoruz.
Change Tracker ile takip edilen tüm nesnelerin görüntülenmesi:
burada önce products tablosunu listelememin sebebi verinin Change Tracker tarafından takip edilmeye başlayacak olmasıdır. Burada allproductsa gelen veriler:
yukarıda dikkat ederseniz products tablosundaki tüm veriler ChangeTracker tarafından takip edilmeye başlandı ve her bir veri sonunda Unchanged yazıyor çünkü hiçbir değişiklik yapmadan önce bu metodu çağırdım, aksi takdirde burada her bir nesne için yaptığımız değişiklik tutuluyor olurdu(added, deleted gibi).
bütün veriler takip mi ediliyor? bu bir zaman maliyeti doğurabilir, değil mi? diye sorduğunuzu duyar gibiyim
Evet bu bir maliyet ve ChangeTracker default olarak enable yani çalışır durumda geliyor. İstersek burada bunu disable yaparak durdurabiliriz. Ama bunu yaparsak da sürekli SaveChanges demeden önce context üzerinden context.ChangeTracker.DetectChanges() diyerek yapılan değişiklikleri tespit etmemiz gerekir, demin demiştik ya SaveChanges ChangeTracker’ı da tetikliyor diye artık o yapmayacağına, nesneleri takip etmeyeceğine göre biz yapmalıyız yoksa hiçbir değişikliğimiz veri tabanına yansımaz, çünkü Entity Framework değişimlerden bihaber olacak.
Buradaki maliyet için yapabileceğimiz bir başka eylem ise AsNoTracking metodudur. Bu metodu kullanarak ChangeTracker’ı devre dışı bırakıyoruz ve bu sayede veri tabanından getirilen verilerin takip edilmesini engelliyoruz. Ancak, bu metodun kullanıldığı yerde veride herhangi bir değişiklik yapılmayacağından emin olmalıyız; aksi takdirde maliyetten daha büyük sorunlarla karşılaşabiliriz :)
Kaynak koda buradan erişebilirsiniz, çok fazla kodun olmadığı bir örnek oldu ama projeyi klonlayıp, çalıştırırsanız veri tabanına bogus paketi ile fake veriler eklenmiş olacaktır, projeyi çalıştırarak ve değiştirip örneklendirerek ilerlemek bu konuyu daha iyi anlamınızı sağlayacaktır. Elimizi kirletmeden olmaz :)
Ben yazarken çok şey öğreniyorum, umarım sizin içinde faydalı olmuştur. Eğer beğendiyseniz takip etmeyi unutmayın, beraber öğrenmeye devam edelim. Yakın zamanda tekrar görüşmek üzere 👋👋👋