Posts Tagged ‘Lazy Loading’
Entity Framework’te Include Metodu
Entity Framework Lazy Loading üzerinde çalışırken iç içe bağlantılarda problemler çıktı. Load ile çözüm bulamadığım bir anda Include Metodu ile problemim çözüldü.
Yine Northwind veri tabanınından örnek verecek olursak: Products tablosundan veriyi çektik, Order Details tablosuna ulaştık. Oradanda Orders tablosuna ulaşmak gerekiyorsa, Şu tür bir yazım çalışma zamanında hata ile karşılaşacaktır.
var product = DataContext.Products
.Include("Order_Details")
.Include("Orders")
.First( x=> x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
Bunun sebebi, Include belirtilen tabloda yer alan Navigation Properties içerisindeki tabloları yükleyebilir. Ama alt tablolardakileri yüklemek gerekiyorsa, o zaman aralarında “.” olacak şekilde, önce üst tablo ismini yazmak, sonrada alt tablo ismini yazmak gerekir. Doğru komut şu şekilde olmalıdır.
var product = DataContext.Products
.Include("Order_Details")
.Include("Order_Details.Orders");
.First( x=> x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
Entity Framework’te Tembellik (Lazy loading)
Entity Framework kullanmaya başladıktan sonra bazı problemler hasıl oldu. Linq to SQL’de, yüklediğimiz bir elemanın bağlı elemanlarını otomatik olarak yüklediği için ayrı bir çalışma yapmamıza gerek kalmıyordu. Mesela Elimizde Nortwind Veri tabanı varsa, bu tablodaki Products tablosundan bir elemanı şu şekilde alabiliyoruz.
var product = DataContext.Products.First( x => x.ProductID == 10);
Products Tablosu Order Details Tablosu ile bağlantılı olduğu için elimizdeki product elemanından bunun bağlı olduğu Order Details satırlarına şöyle ulaşabiliriz.
var orderDetails = product.Order_Details.ToArray();
Normalde bu şekilde orderDetails içinde veri olmasını bekleriz. Ancak EntityFramework Layz Loading(tembel yükleme) yi otomatik olarak çalıştırmamaktadır. Buda veriyi yüklemek için bizim birşeyler yapmamız gerekecektir. Bunun için 2 farklı yol kullanılabilir.
1. Include metodu ile beraber alınması istenilen tabloları belirlemek:
var product = DataContext.Products
.Include("Order_Details")
.First( x => x.ProductID == 10);
var orderDetails = product.Order_Details.ToArray();
2. Load Metodu ile lazım olduğunda verileri çekmek:
var product = DataContext.Products.First( x => x.ProductID == 10); product.Order_Details.Load(); var orderDetails = product.Order_Details.ToArray();
Böylece Order Details yüklenmiş olur.
