Entity Framework - علاقة واحد إلى واحد (One-to-One)

Entity Framework Core - علاقة واحد إلى واحد (One-to-One)

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

---

🔹 كيفية إنشاء علاقة واحد إلى واحد:

  • إنشاء كلاسين (Model Classes) يمثلان الجدولين.
  • استخدام خاصية Navigation Property مع Data Annotations أو Fluent API لتحديد العلاقة.
---

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

1️⃣ كلاس Student:


// ملف Models/Student.cs

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

    // خاصية الملاحة (Navigation Property)
    public StudentAddress Address { get; set; }
}
---

2️⃣ كلاس StudentAddress:


// ملف Models/StudentAddress.cs

public class StudentAddress
{
    public int Id { get; set; }
    public string City { get; set; }
    public string Street { get; set; }

    // مفتاح أجنبي (Foreign Key)
    public int StudentId { get; set; }

    // خاصية الملاحة للطالب المرتبط
    public Student Student { get; set; }
}
---

3️⃣ إعداد العلاقة باستخدام Fluent API داخل DbContext:


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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Student>()
        .HasOne(s => s.Address)
        .WithOne(a => a.Student)
        .HasForeignKey<StudentAddress>(a => a.StudentId);

    base.OnModelCreating(modelBuilder);
}
---

🔹 شرح الكود:

  • كل طالب له عنوان واحد فقط.
  • Student يحتوي على خاصية من نوع StudentAddress.
  • StudentAddress يحتوي على مفتاح أجنبي (StudentId) للإشارة إلى الطالب المرتبط به.
  • باستخدام Fluent API، عرفنا العلاقة بشكل واضح ومحدد.
---

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

  • ✅ المفتاح الأساسي لكلا الكيانين يمكن أن يكون نفس المفتاح في بعض الحالات (Shared Primary Key).
  • ✅ EF Core يدعم تعريف العلاقة بطريقة Data Annotations أيضًا ولكن Fluent API يعطيك تحكمًا أدق.

✅ علاقة One-to-One مفيدة لتنظيم البيانات التي تنتمي منطقيًا معًا ولكن تحتاج إلى تخزينها في جداول منفصلة لاعتبارات التصميم أو الأداء.

تعليقات

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

C# - Arrays

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

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