Entity Framework - Lazy Loading

Entity Framework Core - التحميل الكسول (Lazy Loading)


🧠 ما هو Lazy Loading؟

Lazy Loading يعني تأجيل تحميل الكيانات المرتبطة حتى اللحظة التي تحتاج فيها فعلاً إلى استخدامها، وليس وقت جلب الكيان الأساسي.

بمعنى آخر: الكائن المرتبط يتم تحميله تلقائيًا من قاعدة البيانات عندما يتم الوصول إليه برمجياً لأول مرة.


📚 سيناريو واقعي لفهم الفكرة

لنفترض أن لدينا تطبيق مكتبة:

  • لدينا جدول Books (كتب).
  • وكل كتاب مرتبط بمؤلف Author.
عندما نعرض قائمة الكتب في الصفحة الرئيسية، نريد فقط أسماء الكتب بدون تفاصيل المؤلفين.
ولكن عند دخول المستخدم إلى تفاصيل كتاب معين، نحتاج أن نظهر اسم المؤلف أيضًا.

🔹 باستخدام Lazy Loading:

  • نجلب فقط بيانات الكتاب.
  • وعند الحاجة لبيانات المؤلف (في صفحة التفاصيل)، يتم جلبها أوتوماتيكياً في الخلفية بدون تنفيذ استعلام مسبق لجلب جميع المؤلفين.


🛠️ كيف يتم تفعيل Lazy Loading؟

  1. تثبيت الحزمة الإضافية:
    
    Install-Package Microsoft.EntityFrameworkCore.Proxies
        
  2. ضبط DbContext لاستخدام الـ Proxies:
    
    services.AddDbContext<AppDbContext>(options =>
        options.UseLazyLoadingProxies()
               .UseSqlServer("YourConnectionString"));
        
  3. تحديد الـ 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;

تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

1.1 SQL Introduction

Entity Framework - مقدمة عن Entity Framework