Entity Framework – AsNoTracking İle Takip Sonlandırma

Merhaba,

Yazılım uygulamalarında, parça odaklı yapılan performans aktiviteleri makro düzeye bir bütün olarak yansımakta haliyle genel olarak ilgili uygulama olabildiğince performanslı işlevsellik gösterebilmektedir. Dolayısıyla her bir parçada; kod kalitesine dikkat edilmiş ve bellek yönetimine özen gösterilmişse eğer ve tüm bunların yanında da ekstradan lüzumsuz kodlardan(Dummy Code) arındırılmış ise bu durum mikro düzeyde optimizasyon şeklinde değerlendirilebilmektedir.

İşte bu optimizasyon süreçlerinden veritabanı çalışmalarında kullandığımız ORM(Object Relational Mapping) yaklaşımı olan Entity Framework üzerinde de dikkat etmemiz gereken bir noktaya temas edecek, yapılan aktiviteleri performans ve maliyet açısından nasıl minimize edebileceğimizi inceleyeceğiz…

AsNoTracking Nedir? Ne İş Yapar?

Entity Framework, bir sorgu neticesinde döndürülen tüm nesneleri izlemeye almakta ve bu nesneler üzerindeki tüm değişiklikleri bu şekilde takip edebilmektedir. İşte bu takip sayesinde ilgili nesneler üzerinde yapılan tüm değişiklikleri “SaveChanges” metodu sayesinde veritabanına yansıtabilmektedir. Bu durum biz yazılım geliştiriciler için gayet pratik bir kullanım getirmekte ve ekstradan süreçte performanslı çalışmamızı sağlamaktadır. Evet… Bizler performanslı çalışırız çalışmasına lakin uygulamamız bu takip mekanizmasından dolayı ters tepki göstermekte ve performansı yakıt olarak kullanmakta hele hele büyük boyutlu verilerde ise maliyet oldukça ağır olmaktadır.

Hatta bilirsiniz, piyasada Entity Framework hakkında “yok şöyle yavaş, yok böyle hantal” vs. söylentileri dolaşmaktadır. İşte bu söylentilerin temel sebebi Entity Framework yapılanmasının bu takip mekanizması gibi bazı şeylerinin tam olarak bilinmemesinden dolayı yanlış kullanımından kaynaklanmaktadır.

Peki ne yapacak? neye dikkat edeceğiz?
Bu sorunun cevabını verebilmek için yukarıda bahsettiğim takip mekanizması hakkında söyleşimize devam etmeliyiz… Entity Framework, sorgu neticesinde getirdiği nesneleri otomatik takibe almaktadır. Eğer ki biz yazılım geliştiriciler, bu nesneler üzerinde güncelleme yahut yeni veri ekleme vs. gibi işlemler gerçekleştireceksek bu takip mekanizmasına dokunmaksızın çalışmalarımıza devam etmeliyiz. Yok eğer elde ettiğimiz verileri sade ve sadece elde etmekle yetinecek ve bu veriler üzerinde herhangi bir güncelleme, ekleme yahut silme işlemi gerçekleştirmeyeceksek bu takip mekanizmasını kırmalıyız!

Neden mi?

Yersiz maliyetten kaçınmak için… Nihayetinde üzerinde kesinlikle oynama yapmayacağınız verilerin, üzerinde yapılan oynamaları yakalamak için durmadan ekstra maliyet gerektiren bir mekanizmayla yersiz bir şekilde takip edilmesine hiç gerek yoktur. Haliyle ilgili mekanizma lüzumlu lüzumsuz tüm sorgularda kullanılır ve göz ardı edilirse, birilerini değil Entity Framework hiçbir ORM tatmin etmeyecektir.

AsNoTracking; Entity Framework tarafından uygulamaların performansını optimize etmemize yardımcı olmak için geliştirilmiş bir fonksiyondur. İşlevsel olarak veritabanından sorgu neticesinde elde edilen nesnelerin takip mekanizması ilgili fonksiyon tarafından kırılarak, sistem tarafından izlenmelerine son verilmesini sağlamakta ve böylece tüm verisel varlıkların ekstradan işlenme yahut lüzumsuz depolanma süreçlerine maliyet ayrılmamaktadır.

AsNoTracking ile önemli performans kazanımları elde edilebilir!

AsNoTracking fonksiyonu ile takibi kırılmış tüm nesneler doğal olarak güncelleme durumlarında “SaveChanges” fonksiyonundan etkilenmeyecektirler.

Tracking
            VTContext db = serviceProvider.GetService<VTContext>();
            var personels = db.Personels;
            Personel yeniPersonel = new Personel { Adi = "Gençay", SoyAdi = "Yıldız" };
            personels.Add(yeniPersonel);
            Personel silinecekPersonel = db.Personels.FirstOrDefault(p => p.Id == 7);
            personels.Remove(silinecekPersonel);
            db.SaveChanges();
Tüm nesneler takip edilmekte. Dolayısıyla yapılan tüm aktiviteler veritabanına direkt olarak fiziksel yansıtılmaktadır.
AsNoTracking
            VTContext db = serviceProvider.GetService<VTContext>();
            var personels = db.Personels.AsNoTracking().ToList();
            Personel yeniPersonel = new Personel { Adi = "Gençay", SoyAdi = "Yıldız" };
            personels.Add(yeniPersonel);
            Personel silinecekPersonel = db.Personels.FirstOrDefault(p => p.Id == 7);
            personels.Remove(silinecekPersonel);
            db.SaveChanges();
Takip kesilmekte. Dolayısıyla yapılan tüm aktiviteler veritabanına yansıtılmayacaktır.

Aşağıdaki örnek kod bloklarında yaptığımız test ile AsNoTracking’in performansını ölçebilir ve değerlendirme yapabiliriz.

AsNoTracking kullanılmadığında;
Entity Framework - AsNoTracking İle Takip Sonlandırma
AsNoTracking kullanıldığında;
Entity Framework - AsNoTracking İle Takip Sonlandırma

Gördüğünüz üzere yukarıda yapılan işlemler ancak milisaniye cinsinden bir süreye mal olduklarından dolayı işlem sürelerini milisaniye üzerinden hesaplamamız gerekti. Velhasıl aradaki farka dikkat etmenizi istiyorum 🙂

Artık Entity Framework ile çalışırken elde edilen tüm verisel varlıkların ekleme, silme ve güncelleme durumlarını göz önüne alarak takip etmenizi ve gereksiz izlenim durumlarını göz ardı etmeksizin çalışmalarınıza daha da fazla performans katmanızı öneriyor, yazımı burada noktalıyorum.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.