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