7 Mart 2019 Perşembe

Entity Framework'ün incelikleri - 1 (AsNoTracking(), Eager loading & Lazy Loading & Explicit Loading)

Merhabalar uzun bir aradan sonra. Sizinle entity frameworkde tecrübe ettiğim ufak tefek inceliklerini seri halinde sizinle paylaşacağım.

1- AsNoTracking() 
Bu değişkeni kullandığınızda performansınız 5 kat hızlanabilir. Kendi yaptığım ölçümlere göre 100 milisaniyeden 20 milisaniyelere kadar düşmüştü yoğun bir tabloda.
Kullanımına gelirsek.
dbTestEntites db = new dbTestEntities();
db.tblTest.AsNoTracking().ToList();

Çok basit ve çok hızlı sonuç üretir. Fakat dikkat etmeniz gereken bir konu var ki eğer kayıtlar üzerinde güncelleme yapacaksanız sakın ola bunu kullanmayın. Çünkü kodun da dediği gibi Takip Etme!



1- Eager loading & Lazy Loading & Explicit Loading
Entity Framework default olarak Lazy Loading olarak gelir. Fakat Siz bunu ayarlardan yada kod üzerinden devre dışı bırakabilirsiniz.Yada türetildiği noktada Constructor kısmına
this.Configuration.LazyLoadingEnabled = false;
kodu ile devre dışı bırakabilirsiniz.

a- Lazy Loading.
 Bunu kullandığınızda kod olarak alt tabloları çağrıldıkça yeni sql sorguları çalıştırır.
Örnek:
dbTestEntites db = new dbTestEntities();
var Tests = db.tblTest.ToList();
foreach (var testDetay  in Tests.tblTestDetaylar.ToList())
{
Console.WriteLine(testDetay.Ad);//Döngü her çalıştığında yeni bir sql sorgu üretir.
}

b- Eager Loading.
 Bu da ilk tablo dolarken include ederek tabloları yüklememizi sağlar. Lazy loading'den farkı ise ilk yüklendiğinde lazy sadece main tabloyu yükler. eager ise sizin istediğiniz kadarını yükler.
Örnek:
dbTestEntites db = new dbTestEntities();
var Tests = db.tblTest.Include(o=>o.tblTestDetaylar).ToList();
foreach (var testDetay  in Tests.tblTestDetaylar.ToList())
{
Console.WriteLine(testDetay.Ad);//Döngü her çalıştığında yeni bir sql sorgu üretMEZ.
}
c- Explicit Loading.
 Bu ise Lazy Loading ile Eager Loading arasında bir şeydir. Ana tabloyu yükledikten sonra isteğe bağlı olarak bu tabloyu da üstüne ekle diyebiliriz.
Örnek:
dbTestEntites db = new dbTestEntities();
var Tests = db.tblTes.ToList();
db.Entry(Tests).Referance(o=>o.tblTestDetaylar).Load(); //Burada alt tablo yüklenir.

foreach (var testDetay  in Tests.tblTestDetaylar.ToList())
{
Console.WriteLine(testDetay.Ad);//Döngü her çalıştığında yeni bir sql sorgu üretMEZ.
}