EF Core : Explicit loading, Eager Loading ve Lazy Loading de Nedir?
Bilerek mi kullanıyoruz yoksa bilmeden mi kullanıyoruz yoksa daha kötüsü bundan haberimiz yok mu? :)
Entity Framework Core (EF Core) kullanırken, ilişkili veri setlerini yükleme yöntemleri, verilerin nasıl ve ne zaman sorgulanacağını etkileyen önemli bir faktördür. Veri tabanından ilişkili verileri yükleme yöntemleri; Eager Loading, Lazy Loading ve Explicit Loading olarak üç ana başlıkta incelenebilir.
Eager Loading
Bir ana nesne sorgulanırken ilişkili nesnelerin de aynı sorgu içinde önceden yüklenmesi yöntemidir. Bu, genellikle Include()
metodunu kullanarak gerçekleştirilir. Eager Loading, gereksiz yüklemeleri önlemek ve çok sayıda bağımsız sorgu göndermek yerine tek bir sorguda tüm gerekli verileri almaya yarar.
Örnek
Bir kitaplık uygulamasında, her bir kitabın yazar bilgilerini sorgularken, kitaplar ile yazarlar arasındaki ilişkiyi önceden yükleyerek gereken tüm verileri tek bir sorguda alabiliriz.
var books = context.Books
.Include(book => book.Author)
.ToList();
Bu örnekte, her kitap için ilişkili yazar bilgisi de sorguya dahil edilerek, kitap listesi çekilirken yazarlar da veri tabanından çekilir.
Lazy Loading
Bir nesnenin ilişkili nesnelerinin yalnızca o ilişkili nesnelere erişim sağlandığında yüklenmesi yöntemidir. Bu, performansı optimize etmek için kullanılır, çünkü sadece gerçekten ihtiyaç duyulan veriler yüklenir. Lazy Loading genellikle virtual anahtar kelimesi ile tanımlanmış ilişkili özellikler ve EF Core’un proxy mekanizması ile gerçekleştirilir.
Microsoft.EntityFrameworkCore.Proxies
paketini projenize eklemeniz gerekmektedir.
Install-Package Microsoft.EntityFrameworkCore.Proxies
Örnek
Yine bir kitaplık uygulamasında, bir kitabın yazar bilgisine ancak o kitaba erişildiğinde ihtiyaç duyuluyor olsun.
var book = context.Books.Find(1); // Kitap bilgisi çekilir, yazar bilgisi henüz çekilmez.
var authorName = book.Author.Name; // Yazar bilgisine erişildiğinde, yazar bilgisi veritabanından yüklenir.
Bu örnekte, Author
özelliği virtual
olarak tanımlandığından, yazar bilgisi yalnızca kullanıldığında veri tabanından çekilir.
Explicit Loading
Geliştiricinin manuel olarak belirli bir zaman diliminde ilişkili nesneleri yüklemesi gerektiği durumlar için kullanılır. Load()
metodu kullanılarak gerçekleştirilir ve geliştiriciye yüklemeler üzerinde tam kontrol sağlar.
Örnek
Bir müze uygulamasında, bir sanat eserinin yaratıcısının bilgileri sadece belirli koşullar altında yüklenmek istensin.
var artwork = context.Artworks.Find(1); // Sanat eseri bilgisi çekilir, yaratıcı bilgisi henüz çekilmez.
context.Entry(artwork)
.Reference(a => a.Creator)
.Load(); // Yaratıcı bilgisi manuel olarak yüklenir.
Bu örnekte, Creator
bilgisi sadece gerekli olduğunda ve açıkça talep edildiğinde yüklenir.
Bu yükleme yöntemleri, uygulamanın ihtiyaçlarına ve veri erişim modellerine bağlı olarak kullanılır. Her biri farklı senaryolarda avantajlar ve dezavantajlar sunar.