Entity Framework - Lazy Loading
Entity Framework Core - التحميل الكسول (Lazy Loading)
🧠 ما هو Lazy Loading؟
Lazy Loading يعني تأجيل تحميل الكيانات المرتبطة حتى اللحظة التي تحتاج فيها فعلاً إلى استخدامها، وليس وقت جلب الكيان الأساسي.
بمعنى آخر: الكائن المرتبط يتم تحميله تلقائيًا من قاعدة البيانات عندما يتم الوصول إليه برمجياً لأول مرة.
📚 سيناريو واقعي لفهم الفكرة
لنفترض أن لدينا تطبيق مكتبة:
- لدينا جدول Books (كتب).
- وكل كتاب مرتبط بمؤلف Author.
ولكن عند دخول المستخدم إلى تفاصيل كتاب معين، نحتاج أن نظهر اسم المؤلف أيضًا.
🔹 باستخدام Lazy Loading:
- نجلب فقط بيانات الكتاب.
- وعند الحاجة لبيانات المؤلف (في صفحة التفاصيل)، يتم جلبها أوتوماتيكياً في الخلفية بدون تنفيذ استعلام مسبق لجلب جميع المؤلفين.
🛠️ كيف يتم تفعيل Lazy Loading؟
- تثبيت الحزمة الإضافية:
Install-Package Microsoft.EntityFrameworkCore.Proxies - ضبط
DbContextلاستخدام الـ Proxies:services.AddDbContext<AppDbContext>(options => options.UseLazyLoadingProxies() .UseSqlServer("YourConnectionString")); - تحديد الـ Navigation Properties بأنها
virtual:public class Book { public int BookId { get; set; } public string Title { get; set; } public virtual Author Author { get; set; } }
👨💻 كود عملي متكامل على Lazy Loading
🔸 لنفترض أننا نريد إظهار عنوان الكتاب فقط:
var book = await _context.Books.FirstOrDefaultAsync();
Console.WriteLine(book.Title);
// لاحظ: لم يتم تحميل المؤلف Author هنا
🔸 وعندما نحتاج لاحقًا لاسم المؤلف:
Console.WriteLine(book.Author.Name);
// هنا يتم تنفيذ استعلام جديد في الخلفية لجلب بيانات المؤلف المرتبط بالكتاب
✅ الـ EF Core يقوم بتنفيذ استعلام إضافي تلقائيًا عند أول وصول إلى الخاصية Author.
⚡ ملاحظات مهمة
- إذا كنت ستحتاج دائمًا للبيانات المرتبطة مباشرةً، فمن الأفضل استخدام Eager Loading لتجنب كثرة الاستعلامات.
- Lazy Loading مناسب عندما لا تكون متأكدًا أنك ستحتاج إلى البيانات المرتبطة دائمًا.
- قد يؤدي إلى مشكلة N+1 Problem إذا استخدمته بكثرة بدون مراقبة.
🔍 مقارنة سريعة: Eager vs Lazy Loading
- Eager Loading: تحميل كل شيء من البداية.
- Lazy Loading: تحميل عند الحاجة فقط.
🧪 تطبيق عملي أوسع - متجر إلكتروني
افترض أن لدينا نظام متجر إلكتروني فيه:
- جدول Products (منتجات).
- كل منتج مرتبط بـ Category (تصنيف).
public class Product
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public virtual Category Category { get; set; }
}
🔸 عند عرض قائمة المنتجات:
// فقط المنتجات تُعرض بدون تفاصيل التصنيفات
var products = await _context.Products.ToListAsync();
🔸 عند عرض تفاصيل منتج معين:
var product = await _context.Products.FirstOrDefaultAsync(p => p.ProductId == 5);
// فقط عند الوصول لـ product.Category.Name يتم جلب بيانات التصنيف
var categoryName = product.Category.Name;
تعليقات
إرسال تعليق