Entity Framework Core – Lazy Loading

Merhaba,

Yazılım uygulamalarında temelde esas amacımız bir veriyi doğru işleyebilmek ve varsa üretilen çıktıyı doğru bir şekilde gerekli yere yansıtabilmektir. Basit bir rehberlik uygulamasından tutun uzaya füze göndermeye kalksak bile en temeldeki gayemiz budur ve tüm çaba ve inşalarımız bunun üzerine kuruludur. Keza veri dediğimiz olgu tek başına büyük anlam ifade etsede, birden fazla veri ilişkisel olarak bir araya gelerek oluşturdukları bütün sayesinde daha da büyük anlam ifade edebilmektedirler. Dolayısıyla yazılım uygulamaları genellikle tek bir veri üzerinden değil, o veriyle ilişkili diğer veriler üzerinden de işlem yapma mecburiyetini gütmektedirler. Haliyle süreçte elimizde olan veriyle ilişkili tüm verileri elde etmemiz gerekebilir. İşte bunun için elimizdeki veriyle ilişkisel olan tüm verileri tek tek getirmek yerine Entity Framework bu işi üstlenmekte ve Lazy Loading dediğimiz Tembel Yükleme aracılığıyla ilgili verileri bizlere ulaştırmaktadır.

.NET Core’dan önce Standart Framework mimarisinde Entity Framework yapılanması varsayılan olarak açık bir şekilde gelmekteydi. Keza bu varsayım en basit sorgularda bile lüzumsuz ilişkisel tüm verileri getirmekte ve hem sorgusal hem de yazılımsal yüksek maliyetlere sebep olmaktaydı. Bu duruma istinaden biz developerlar varsayılan Lazy Loading mekanizmasını kapatır ve ihtiyacımız doğrultusunda Include mekanizmasını devreye sokardık.

.NET Core mimarisi buradaki varsayımsal durumu değiştirerek Entity Framework Core yapılanmasında Lazy Loading mekanizmasını kapatarak, ihtiyaç dahilinde developerın iradesine bırakmıştır ve böylece Lazy Loading mekanizmasını bilmeyenler için yersiz maliyetin önüne geçmiştir. İşte bu içeriğimizde Entity Framework Core çalışmalarında Lazy Loading’i nasıl devreye sokacağımızı ve nelere dikkat etmemiz gerektiğini inceleyeceğiz.

İlk Olarak

Herşeyden önce örneklendirme yapabilmek için bir adet Asp.NET Core MVC uygulaması açınız ve ardından ister Code First istersenizde Database First yöntemiyle uygulamayı bir veritabanı ile ilişkilendiriniz.

Ayrıca…

Lazy Loading; Entity Framework Core kütüphanesine dahili olarak eklenmemiş, harici olarak Proxy şeklinde kullanılabilir bir özelliğe çevrilmiştir. Bundan dolayı .NET Core – EF Core uygulamalarında Lazy Loading’i kullanabilmek için Microsoft.EntityFrameworkCore.Proxies kütüphanesini projeye entegre etmeniz gerekmektedir.

Lazy Loading Proxy Kullanımı

EF Core uygulamasında Lazy Loading Proxy’i devreye sokabilmek için context sınıfı(DbContext’ten türeyen) içerisinde override edilen “OnConfiguring” metodunda aşağıdaki operasyonun gerçekleştirilmesi gerekmektedir.

    public class MyDBContext : DbContext
    {
        public MyDBContext(DbContextOptions<MyDBContext> dbContext) : base(dbContext) { }
        public DbSet<Personel> Personeller { get; set; }
        public DbSet<Satis> Satislar { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseLazyLoadingProxies();
        }
    }

Bu işlem neticesinde artık ilgili uygulamada yapılan tüm EF sorgulamalarında Lazy Loading çalışacak ve hedeflenen veriler ilişkisel olduğu veriler ile bütün halinde elde edilecektir.
Entity Framework Core - Lazy Loading

Olası InvalidOperationException Hatası

Yukarıdaki çalışmayı yaptığınız taktirde InvalidOperationException olası hatasını alıyorsanız aşağıdaki durumları göz önüne alarak çalışmanızı düzenlemenizi öneririm. Tabi öncelikle ilgili hatayı tam olarak incelememiz gerekirse eğer;

System.InvalidOperationException: ‘Navigation property ‘Satislar’ on entity type ‘Personel’ is not virtual. UseLazyLoadingProxies requires all entity types to be public, unsealed, have virtual navigation properties, and have a public or protected constructor.’

Hatanın görsel hali ise;
Entity Framework Core - Lazy Loading

Çözüm
Bu hatanın sebebi, Lazy Loading yapılırken entityler/modeller arasındaki ilişkiyi sağlayan Navigation Propertylerin sanal olarak tanımlanmamasından kaynaklanmaktadır. Yapmamız gereken tek işlem tüm modellerdeki ilişkisel bağları oluşturan propertyleri virtual keywordü ile işaretlemenizdir.
Entity Framework Core - Lazy Loading
İşte çözüm bu kadar basit 🙂

Ve böylece .NET Core uygulamalarında EF Core ile Lazy Loading’in nasıl yapılacağını detaylıca incelemiş ve olası hatalara dair nasıl çözüm alınabileceğini görmüş olduk. Tabi siz yine ehemmiyeti göz ardı etmeksizin lüzum olmadığı taktirde Lazy Loading mekanizmasını mümkün mertebe pasif tutmaya özen göstermeyi unutmayınız 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Copy Protected by Chetan's WP-Copyprotect.