در EF Core سه روش برای بارگذاری دادههای مرتبط (Navigation Properties) وجود دارد: لودینگ Eager، Lazy و Explicit در این آموزش با مثال ساده و کاربردی Publisher و Book با هر سه روش در Asp.Net Core آشنا میشویم.
فرض کنید برنامهای داریم که اطلاعات ناشرها و کتابهای مربوط به هر ناشر را نگهداری میکند. مدلها به شکل زیر هستند:
public class Publisher
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Book> Books { get; set; } = new List<Book>();
}
//
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public int PublisherId { get; set; }
public Publisher Publisher { get; set; }
}
در این روش، EF Core دادههای مرتبط را همزمان با داده اصلی و با استفاده از متد Include() بارگذاری میکند.
var publishers = context.Publishers
.Include(p => p.Books)
.ToList();
مزایای روش Eager Loading :
معایب روش Eager Loading:
در این روش، دادههای مرتبط فقط وقتی که به آنها دسترسی پیدا میکنیم بارگذاری میشوند.
پیشنیاز روش Lazy Loading:
dotnet add package Microsoft.EntityFrameworkCore.Proxies
services.AddDbContext<AppDbContext>(options =>
options.UseLazyLoadingProxies()
.UseSqlServer(connectionString));
ویژگی navigation باید virtual باشد.
مثال روش Lazy Loading:
var publisher = context.Publishers.First();
var books = publisher.Books;
مزایا روش Lazy Loading:
معایب روش Lazy Loading:
در این روش، شما خودتان به صورت دستی تعیین میکنید که چه زمانی دادههای مرتبط بارگذاری شوند.
متد Entry در EF Core بهت امکان میده به اطلاعات داخلی و وضعیت (state) یک شیء خاص از Entity دسترسی پیدا کنی. این اطلاعات داخل Change Tracker نگهداری میشه.
مثال دریافت یک محموعه :
var publisher = context.Publishers.First();
context.Entry(publisher)
.Collection(p => p.Books)
.Load();
یا برای بارگذاری یک شی:
var book = context.Books.First();
context.Entry(book)
.Reference(b => b.Publisher)
.Load();
مزایا:
معایب:
| ویژگی | Eager Loading | Lazy Loading | Explicit Loading |
|---|---|---|---|
| تعداد کوئری | ۱ | زیاد (N+1) | قابل کنترل |
| کنترل بارگذاری | متوسط | کم | زیاد |
| پیکربندی اضافه | نیاز ندارد | نیاز به Proxies دارد | نیاز ندارد |
| کدنویسی اضافه | کم | کم | زیاد |
| ریسک بارگذاری اضافی | بالا | کم | کم |
| مناسب برای | وقتی داده حتماً نیاز است | وقتی نیاز احتمالی است | وقتی کنترل و بهینهسازی مهم است |
استفاده درست از این روشها باعث افزایش کارایی، کاهش مصرف منابع و جلوگیری از بارگذاریهای غیرضروری در EF Core میشود.
در برخی پروژهها برای تبدیل مستقیم موجودیتها به DTO، از قابلیت ProjectTo در AutoMapper استفاده میکنیم. این روش باعث میشود تبدیل دادهها مستقیماً در سطح دیتابیس (SQL) انجام شود و فقط فیلدهای موردنیاز واکشی شوند.
ProjectTo رفتاری مشابه Eager Loading دارد، ولی حتی بهینهتر عمل میکند.
تشکر از سرفصل های کامل، بسیار حرفه ای و به روز
همه چی عالی
یکی از بهترین آموزش هایی بود که تا حالا دیدم