Veysel Uğur KIZMAZ

Entity Framework Lazy Loading

16.06.2012Okunma Sayısı: 14367Kategori: Entity Framework

 Bu makalemizde Entity Framework’te Lazy Loading durumlarını inceleyelim.

 
Örnek uygulamamızda Yazar ve Makale tablolarımız yer almaktadır. Makalemizin bir yazarı olduğunu belirtmek için Makale tablomuzun YazarId sütunu ile Yazar tablomuzun Id sütunu arasında ilişki kuruyoruz.
 
 
Veritabanımızı oluşturduktan sonra Visual Studio’da yeni projemizi oluşturup işlemlerimize başlayalım.
 
Projemize Ado.Net Entity Model ekliyoruz. Eklediğimiz modele veritabanında oluşturduğumuz tabloları ekliyoruz.
 
 
 
Örnek uygulamamızda veritabanındaki yazar bilgilerini almak istiyoruz. Bunun için birçoğumuz aşağıdaki kodu oluşturacağız.
 
 
  1. DenemeDbEntities provider = new DenemeDbEntities();
  2. var yazar = (from y in provider.Yazar
  3.         where y.Id == 1
  4.         select y);
Bu örnekte entityin Yazar tablosundan yazar Id’si 1 olan kaydı getirmesini beklemekteyiz. Yalnız veritabanı tarafı için frameworkün hazırladığı kod, beklentimizin daha fazlasının geldiğini göstermektedir. Frameworkün hazırladığı SQL kodunu incelersek,
 
 
  1. SELECT
  2. [Extent1].[Id] AS [Id],
  3. [Extent1].[AdSoyad] AS [AdSoyad],
  4. [Extent1].[EMail] AS [EMail]
  5. FROM [dbo].[Yazar] AS [Extent1]
  6. WHERE 1 = [Extent1].[Id]
Yazar tablosunda istenen kriterlerin tüm bilgilerini de getirmektedir.
Entity’nin avantajlarını kullanırken şöyle bir durum da isteyebiliriz. Yazar tablosunu veritabanından çekerken hiçbir join yapmadan yazara bağlı İSTEDİĞİMİZ tabloların bilgilerini de getirebilelim. Bunun için LazyLoading özelliğini kullanıyoruz.
 
Örnek üzerinde incelemek istersek, Yazar tablosunu alırken herhangi bir join olmadan sadece yazar bilgilerini çekmek isteyip, yanında sadece Makale tablosunun bilgilerini de getirelim. Bunun için aşağıdaki kodu uygulayabiliriz.
 

 
  1. DenemeDbEntities provider = new DenemeDbEntities();
  2.             provider.ContextOptions.LazyLoadingEnabled = false;
  3.             var yazar = (from y in provider.Yazar.Include("Makale")
  4.                          where y.Id == 1
  5.                          select y);

provider.ContextOptions.LazyLoadingEnabled = false; kodu ile LazyLoading’ini kapatıyoruz.
provider.Yazar.Include("Makale") .buradaki Include ile Yazar tablosuna bağlı sadece Makale tablosunun bilgilerini de almak istenmektedir. Bu kodun Framework tarafından oluşturulan SQL kodu aşağıdaki gibidir.
 
 
  1. SELECT
  2. [Project1].[Id] AS [Id],
  3. [Project1].[AdSoyad] AS [AdSoyad],
  4. [Project1].[EMail] AS [EMail],
  5. [Project1].[C1] AS [C1],
  6. [Project1].[Id1] AS [Id1],
  7. [Project1].[YazarId] AS [YazarId],
  8. [Project1].[Tanim] AS [Tanim],
  9. [Project1].[Aciklama] AS [Aciklama],
  10. [Project1].[Detay] AS [Detay]
  11. FROM ( SELECT
  12.             [Extent1].[Id] AS [Id],
  13.             [Extent1].[AdSoyad] AS [AdSoyad],
  14.             [Extent1].[EMail] AS [EMail],
  15.             [Extent2].[Id] AS [Id1],
  16.             [Extent2].[YazarId] AS [YazarId],
  17.             [Extent2].[Tanim] AS [Tanim],
  18.             [Extent2].[Aciklama] AS [Aciklama],
  19.             [Extent2].[Detay] AS [Detay],
  20.             CASE WHEN ([Extent2].[Id] IS NULLTHEN CAST(NULL AS intELSE 1 END AS [C1]
  21.             FROM [dbo].[Yazar] AS [Extent1]
  22.             LEFT OUTER JOIN [dbo].[Makale] AS [Extent2] ON [Extent1].[Id] = [Extent2].[YazarId]
  23.             WHERE 1 = [Extent1].[Id]
  24. AS [Project1]
  25. ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC
Kodu incelediğimizde istediğimiz verilerin geldiğiniz de görebilmekteyiz.
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel@ugurkizmaz.com