آموزش لودینگ Eager، Lazy و Explicit در EF Core

تهران آی تی / برنامــه نویــسـی / آموزش لودینگ Eager، Lazy و Explicit در EF Core

آموزش لودینگ Eager، Lazy و Explicit در EF Core (با مثال ساده Publisher و Book)

در 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; }
}

لودینگ پیش‌گیرانه – Eager Loading

در این روش، EF Core داده‌های مرتبط را هم‌زمان با داده اصلی و با استفاده از متد Include() بارگذاری می‌کند.

var publishers = context.Publishers
.Include(p => p.Books)
.ToList();

مزایای روش Eager Loading :

  • فقط یک کوئری به دیتابیس فرستاده می‌شود.
  • مناسب زمانی است که مطمئن هستید به داده‌های مرتبط نیاز دارید.
  • خوانایی و سادگی کد بالا می‌رود.

معایب روش Eager Loading:

  • اگر داده‌های مرتبط زیاد باشند، ممکن است اطلاعات زیادی بارگذاری شود که اصلاً استفاده نشوند.
  • پیچیده شدن کوئری SQL در صورت استفاده از چندین Include() تو در تو.

لودینگ تنبل – Lazy 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:

  • ممکن است برای هر navigation property یک کوئری جداگانه اجرا شود (مشکل N+1).
  • برای تست و اشکال‌زدایی سخت‌تر است.
  • نیاز به پیکربندی و فعال‌سازی پروکسی‌ها دارد.

لودینگ دستی – Explicit 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 دارد نیاز ندارد
کدنویسی اضافه کم کم زیاد
ریسک بارگذاری اضافی بالا کم کم
مناسب برای وقتی داده حتماً نیاز است وقتی نیاز احتمالی است وقتی کنترل و بهینه‌سازی مهم است

جمع‌بندی نهایی

  • اگر می‌دانید که به داده‌های مرتبط نیاز دارید، از Eager Loading استفاده کنید.
  • اگر نمی‌دانید که آیا نیاز می‌شود یا نه، Lazy Loading انتخاب مناسبی است.
  • اگر می‌خواهید کنترل کامل داشته باشید یا پروژه‌تان بزرگ است، از Explicit Loading بهره ببرید.

استفاده درست از این روش‌ها باعث افزایش کارایی، کاهش مصرف منابع و جلوگیری از بارگذاری‌های غیرضروری در EF Core می‌شود.

استفاده از ProjectTo در EF Core

در برخی پروژه‌ها برای تبدیل مستقیم موجودیت‌ها به DTO، از قابلیت ProjectTo در AutoMapper استفاده می‌کنیم. این روش باعث می‌شود تبدیل داده‌ها مستقیماً در سطح دیتابیس (SQL) انجام شود و فقط فیلدهای موردنیاز واکشی شوند.

ProjectTo رفتاری مشابه Eager Loading دارد، ولی حتی بهینه‌تر عمل می‌کند.

نکات مهم هنگام استفاده از ProjectTo

  • فقط فیلدهایی که در DTO تعریف شده‌اند، از دیتابیس واکشی می‌شوند.
  • نیازی به استفاده از Include نیست.
  • متد ProjectTo روی IQueryable کار می‌کند و مستقیم به SQL تبدیل می‌شود.
  • عملکرد آن در بیشتر موارد بهتر از Select و حتی Include است.
جستجو کنید
دسترسی سریع
دسته ها

طراحی و پیاده سازی پروژه های طراحی سایت دانشجویی

انجام، اجرا و طراحی پروژه های طراحی سایت برای دانشجویان با HTML CSS PHP ASP.NET JAVA و ... با کمترین هزینه. برای مشاهده نمونه کارها و یا دریافت مشاوره رایگان از تیم طراحی سایت تهران آی تی با ما در تماس باشید. ما بهترین پروژه های طراحی سایت را با حداقل هزینه برای شما طراحی میکنیم - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

مطالب مرتبط

لطفا از مطالب مرتبط با این پست دیدن فرمایید

جــذاب های هفته

از پربازدیدترین مطالب تهران آی تی در هفته ای که گذشت دیدن فرمایید

باورکردنی نیست فقط با 300 هزار تومان

طراحی سایت شما + طراحی اپلیکیشن هدیه و رایگان
این یک حراج است در مدت زمان محدود - شرکت های زیادی سایت های ارزان طراحی میکنند اما آیا کیفیت لازم را دارا هستند؟ طراحی سایت ارزان به همراه اپلیکیشن رایگان هدیه برای اولین بار توسط تهران آی تی مخصوص سازمان ها و کسب و کار های کوچک و بزرگ و حتی جدید تیم طراحی سایت تهران آی تی در کنار شماست تا شناخته شوید - مشاوره رایگان 09121486770

مــشاوره و مشاهده نمونه کارها

پشتیبانی 24 ساعته

تیم تهران آی تی در هفت روز هفته و 24 ساعت روز آماده پاسخ گویی به سوالات کاربران و ارائه مشاره رایگان میباشد