3 min read

Entity Framework Core : Include kullanımı

EF Core kullanırken veritabanından modelimizle bağlantılı olan kayıtların da getirilmesini istiyorsak Include() metodunu kullanabiliriz.
Entity Framework Core : Include kullanımı

Eager loading: Include() ile ilişkili kayıtları okuma

Eager loading, lazy loading kavramlarını duymuşsunuzdur. Bu kavramlarla birbirine bağlantılı tablolardan veri almak için kullandığımız stratejiyi ifade ederiz. Eğer sadece erişim anında getirilmesini istiyorsak lazy loading de seçilebilir (aşırı sorgulama ile performansı düşürebileceğinden önerilmiyor). Her daim bağlantılı kayıtların hazır getirilmiş olmasını istiyorsak eager loading seçeriz.

Örneğin bir müşterinin siparişlerini getirmek için Orders adlı navigation property'yi Include() içerisine alarak kullanabiliriz.

[HttpGet]
public IList<Customer> Get()
{            
  return _context.Customer.Include(c => c.Orders).ToList();
}

Veritabanına bir müşteri ve sipariş kaydı ekleyelim.

Swagger ile GET /Customers isteği gönderdiğimizde bir müşteri ve ona ait olan tek siparişi görebiliyoruz.

Eğer Include() kullanmasaydık sipariş listesi boş gelecekti.

[HttpGet]
public IList<Customer> Get()
{            
  return _context.Customer.ToList();
}

Aynı kişi bir sipariş daha verdiğinde yine Include() kullanarak listede şimdi iki sipariş olduğunu görebiliriz.


Hata: JsonException: A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.

Burada bir reference cycle hatası alabilirsiniz. Bunu düzeltmek için şimdilik Newtonsoft.Json ekleyerek referans döngüsüne girilmesini önleyebiliyoruz.

dotnet add package Microsoft.AspNetCore.Mvc.NewtonsoftJson --version 5.0.2
 public void ConfigureServices(IServiceCollection services)
{
  services.AddControllers().AddNewtonsoftJson(options =>
    options.SerializerSettings.ReferenceLoopHandling = 	Newtonsoft.Json.ReferenceLoopHandling.Ignore); 
  //...
}

Bu problemin son durumunu github'da takip edebilirsiniz.

Proposal: Add mechanism to handle circular references when serializing · Issue #30820 · dotnet/runtime
See initial proposal with extended comments here: https://github.com/dotnet/runtime/pull/354/files See proposal extension for ReferenceResolver on #30820 (comment). Rationale and Usage Currently th...

Bu tarz fix'leri sevmiyorsanız, haklısınız. Burada önerilebilecek güzel bir yaklaşım return ettiğimiz nesneleri temsilen yeni birer ViewModel oluşturmaktır. Bu şekilde geri döndürülen modellerde navigation property'ler olmadığından döngü problemi de ortadan kalkar. Fakat çeşitli sebeplerden dolayı her modele birer ViewModel ekleyemeyenler elbette olacaktır. Yine de bu konuyla ilgilenenler Wade'in yazısına göz atabilirler.

Fixing JSON Self Referencing Loop Exceptions - .NET Core Tutorials
I’ve debated about posting an article on this for a long long time. Mostly because I think if you code any C# MVC/API project correctly, you should almost never run into this issue, but I’ve seen people run into the problem over and over again. What issue? Well it’s when you end up with two […]