Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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...

10 Cevaplar

  1. Can dedi ki:

    Hocam merhaba, AsNoTracking kullandığımızda add update delete işlemlerinde bir sıkıntı olmuyor anladığım kadarıyla peki o zaman takip edilip veritabanına yansıyan ne bir başka deyişle AsNoTracking kullandıktan sonra veritabanına yansımayan ne?

    • mücteba dedi ki:

      merhaba can. AsNoTracking; takip i iptal ediyor. Haliyle Veritabanına veri gönderme veya veritabanından veri çekme yada veri tabanında güncelleme işlemlerini yapmak için kullandığın tüm fonksiyonlar unable(bir nevi geçersiz) oluyor. Yani hocam makalede fonksiyonları kullanmış. Heralde seni yanıltan şey o. kullanış ama bi faydası yok demek istiyor. saygılar..

    • Oğuzcan Genç dedi ki:

      Burada eğer AsNoTraction kullanırsan örneğin bir update işleminde Update metodunu kullanmadan update işlemi gerçekleştiremezsin buda tüm kolonlar ile birlikte güncelleme yapma zorunluluğu getirir. Örnek olarak 50 kolona sahip bir tablonu AsNoTracktion kullanarak çekip bir kaç kolonu değiştirip SaveChanges() metodunu çalıştırırsan takibi kapattığın için veriyi güncelleyemezsin.

  2. Ahmet dedi ki:

    Hocam merhabalar.

    N-Katmanlı Mimaride Service layerdaki metotlar için bu asnotracking olayını nasıl kullanabiliriz ? Örneğin Aynı servisi zaman zaman read zaman zaman update işlerinde kullanabiliyoruz, aslında servisler tam olarak bunun için var. Ama her servis için 2 farklı metod yamak oldukça meşakkatli ve gereksiz kod kalabalığı yaratacak. (asnotrackingli ve asnotrackingsiz olarak ayrı ayrı).

    İlginiz için teşekkürler.
    Sevgiler.

  3. Ahmet dedi ki:

    Kendi soruma cevap niteliğinde bir paylaşım olacak ama şöyle bir yöntem buldum. Belki birilerine faydası dokunur.

     public class ServicesBase
        {
            protected AppDbContext dbcontext { get; }
            public ServicesBase(AppDbContext dbcontext, UserManager userManager = null, SignInManager signInManager = null)
            {
                this.dbcontext = dbcontext;
            }
    
            public void AsNoTracking()
            {
                dbcontext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
            }
    
            public void SaveChanges()
            {
                dbcontext.SaveChanges();
            }
        }
    

    KULLANIM (Controller)

    _masterService.AsNoTracking();
    var asd = _masterService.GetById(1);
    asd.WagePerSquareMeter = 21;
    _masterService.SaveChanges();
    

    ister _masterService.SaveChanges üzerinden ister dbcontext.Savechanges üzerinden save ettiğinizde veritabanına yansımadığını göreceksiniz. Hocam sizlerin de katkılarını ve eleştirilerinizi bekliyoruz 🙂

    Sevgiler

    • Gençay dedi ki:

      Bir önceki cevabımda söylediğim gibi hususi yöntemlerden başka genel geçerliliği kabul edilebilir bir teknik olmadığı için bu yöntemde geçerlilik göstermektedir. Lakin eleştirel gözle baktığımızda ilgili servis üzerinden yapılacak sorgulamalarda eğer track mekanizmasının devre dışı bırakılması gerektiği durumlar söz konusu olursa iş kuralı olarak (servis nesnesi üzerinden)’AsNoTracking’ metodunun çağrılması gerektiği bilgisine developer açısından vakıf olunması zaruriyeti söz konusudur. Bu durumda da unutulduğu yahut bilinmediği anlarda geliştiricilerin istemeden maliyetli çalışmalar yapması gibi bir durum söz konusu olabilmektedir. O yüzden bu tarz çalışmalarda olayları hatırlatıcı mahiyette(misal olarak parametrik yahut fluent şeklinde) inşa etmekte fayda vardır kanaatindeyim.

  4. Merhaba Ahmet kardeşim ben de bir not eklemek isterim ki; ilk olarak hız, aynı method içinde sorgu + update ve delete işlemi yaptığında vb işlemlerde kullanılabilir. Yaptığın where sorgusunda db’den yaptığın sorgu işleminde bazı işlemler alt bölümdeki db işlemine aktarılıyor. Bunun için ilk satırlarda yaptığımız db işlemleri alt satırlara yansımaması için AsNoTracking kullanılıyor. (alt satırlardaki update, delete işlemi çalışabilsin diye, performas vb. işlemler) Örnek: kullanıcı sorguladık altta da güncelledik. Buradaki kullanıcıyı sorgulama işleminde AsNoTracking kullanmak gerekiyor. İyi çalışmalar. Dilim döndüğünce anlatmaya çalıştım hatam varsa arkadaşlar ekleme yapabilir. Teşekkürler. Hız işlemi için yabancı kaynak: https://www.c-sharpcorner.com/UploadFile/ff2f08/entity-framework-and-asnotracking/

  5. Engin ÇELİK dedi ki:

    Selamlar

    AsNoTracking işlemini yalnızca read işlemlerinde kullanıyoruz demek doğru olur mu? Çünkü veritabanını etkileyecek işlemlerde savechanges metodu çalışması gerektiğinden AsNoTracking kulllanmak doğru olmaz. Eğer yanılıyorsam lütfen beni düzeltin. Anlamaya çalışıyorum

Bir cevap yazın

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