13 Şubat 2023 Pazartesi

Lazy/Eager/Explicit Loading

Entityler içerisinde bulunan ilişkili verilerin yüklenmesini yönetmek için Lazy, Eager ve Explicit olmak üzere 3 yöntem vardır.

Entity framework’ün ilişkili davranışı yüklemedeki default davranışı eager loadingdir. Bu yüzden entity framework üzerinde lazy loading yapmak istiyorsak, nuget üzerinden EntityFrameworkCore.Proxies paketini yüklemeliyiz.


User ve Order tablosu arasına user 1 .......n Order ilişkisi olduğunu düşünelim.



Lazy Loading

Lazy loading uygulamak için EntityFrameworkCore.Proxies nuget paketini indiriyoruz.Ve startup.cs üzerinde aşağıdaki configurasyonu yapıyoruz.


Entity framework üzerinde yükleme türü olarak lazy loading kullanıldığında, ilişkili veriler yüklenmez. Entity sınıfı üzerinden ne zaman ilişkili bir alana erişilmek istenirse, o zaman veri tabanına ilişili tabloya özel yeni bir sorgu atılarak ilişkili veriler getirilir.


  • Yukarıda ilk satır için sadece users getirilmiştir. Daha sonra user.Orders querysi için veritabanına yeni bir sorgu atılmıştır ve Orders getirilmiştir.
  • lazy loading kullanılan işlemlerde, her bir ilişkili alana erişim isteğinde veri tabanına yeni bir query gönderilecektir. Fazla kayıt olan işlemlerde bu performans sorunu doğurabilir. İkinci sorguyu ilişkili tabloya atılıyor buna dikkat edelim yani orders tablosuna.




Eager Loading

Eager loading, veri tabanından kayıtlar çekilirken getirilmesi istenen ilişkili alanların da beraberinde getirilme işlemidir. Eager loading kullanarak ilişkili alanların tek sorguda getirilmesini sağlayabiliyoruz, ancak sonrasında getirilmemiş ilişkili alanlara erişme isteğinde veriler getirilmeyecektir.

Getirilmesi istediğimiz alanları “Include” methodu ile belirtebiliyoruz.




Explicit Loading

Explicit loading için, aslında lazy ve eager loadingin karışımı diyebiliriz. Veri tabanından veriler çekilirken, hiç bir ilişkili alan getirilmez. Eager loadingden farkı, ilişkili alanları sonradan yükleyebilmemizdir.

İlk satırı çalıştırdığımızda, belirtildiği gibi sadece user tablosuna sorgu atılmakta. İkinci satırı çalıştırdığımızda, bu user nesnesi için ilişkili siparişleri entity üzerinde yüklemekte.

Aynı lazy loadingde olduğu gibi order tablosuna ayrı bir sorgu oluşturuldu ve ilgili siparişler getirildi. Buradaki kilit nokta, ilişkili dataların yüklenmesi komutunu bizim kendimizin vermiş olması.




REFERENCE

Hiç yorum yok:

Yorum Gönder