Entity Framework - علاقة متعدد إلى متعدد (Many-to-Many)

Entity Framework Core - علاقة متعدد إلى متعدد (Many-to-Many)

في علاقة متعدد إلى متعدد (Many-to-Many)، كل سجل في الجدول الأول يمكن أن يكون مرتبطًا بعدة سجلات في الجدول الثاني، والعكس صحيح.

---

🔹 كيفية إنشاء علاقة Many-to-Many:

  • إنشاء كلاسين يمثلان الجداول.
  • تعريف مجموعة (Collection) من النوع الآخر داخل كل كلاس.
  • منذ EF Core 5.0، يمكنك إنشاء العلاقة بدون الحاجة لجداول وسيطة يدوية (EF Core ينشئها تلقائيًا).
---

🔹 مثال عملي: علاقة بين Student وCourse:

1️⃣ كلاس Student:


// ملف Models/Student.cs

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    // كل طالب يمكن أن يدرس عدة كورسات
    public ICollection<Course> Courses { get; set; }
}
---

2️⃣ كلاس Course:


// ملف Models/Course.cs

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; }

    // كل كورس يمكن أن يدرس بواسطة عدة طلاب
    public ICollection<Student> Students { get; set; }
}
---

3️⃣ إعداد العلاقة باستخدام Fluent API (اختياري إذا أردت تخصيص الجدول الوسيط):


// داخل ملف ApplicationDbContext.cs

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasMany(s => s.Courses)
        .WithMany(c => c.Students)
        .UsingEntity(j => j.ToTable("StudentCourses"));

    base.OnModelCreating(modelBuilder);
}
---

🔹 شرح الكود:

  • تعريف ICollection<Course> داخل Student يعني أن كل طالب يمكن أن يسجل في أكثر من كورس.
  • تعريف ICollection<Student> داخل Course يعني أن كل كورس يمكن أن يدرس بواسطة أكثر من طالب.
  • باستخدام UsingEntity قمنا بتحديد اسم الجدول الوسيط ليكون "StudentCourses".
---

🔹 ملاحظات مهمة:

  • ✅ إذا لم تحدد جدول وسيط باستخدام Fluent API، EF Core سينشئ جدول وسيط تلقائيًا بالاسم الافتراضي.
  • ✅ يمكنك تخصيص أسماء الحقول أو إضافة خصائص إضافية في الجدول الوسيط إذا احتجت.

✅ علاقات Many-to-Many شائعة جدًا، خصوصًا في التطبيقات التي تحتوي على اشتراكات، تسجيل مواد، أنظمة صلاحيات، وغيرها.

تعليقات

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

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

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