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 مفيدة لتنظيم البيانات التي تنتمي منطقيًا معًا ولكن تحتاج إلى تخزينها في جداول منفصلة لاعتبارات التصميم أو الأداء.
تعليقات
إرسال تعليق