روابط بین Entity در EF Core چطور تعریف میشود؟
نگاشت رابطه یکبهچند، چندبهچند و یکبهیک بین کلاسهای C# به Foreign Key و جدول واسط در دیتابیس رابطهای.
چرا مهم است؟
تقریباً هیچ دیتابیس واقعی از یک جدول تنها تشکیل نشده؛ فهم درست رابطهها در EF Core از بروز باگهای ظریف (مثل بارگذاری نشدن داده مرتبط یا حذف اشتباه Cascade) جلوگیری میکند.
یکبهچند (One-to-Many)
public class Customer
{
public int Id { get; set; }
public List<Order> Orders { get; set; } = [];
}
public class Order
{
public int Id { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; } = null!;
}
EF Core بهصورت خودکار CustomerId را بهعنوان Foreign Key تشخیص میدهد (بر اساس Convention نامگذاری).
چندبهچند (Many-to-Many)
public class Product { public List<Tag> Tags { get; set; } = []; }
public class Tag { public List<Product> Products { get; set; } = []; }
EF Core (از نسخه ۵ به بعد) خودش یک جدول واسط (ProductTag) میسازد، بدون نیاز به تعریف صریح کلاس واسط.
بارگذاری داده مرتبط
- Eager Loading:
context.Customers.Include(c => c.Orders) - Lazy Loading: با فعالسازی جداگانه، دسترسی به Property مرتبط خودکار Query جدید میزند (باید با احتیاط استفاده شود — N+1 Query).
اشتباه رایج
❌ پیمایش یک Collection مرتبط داخل حلقه بدون Include — هر تکرار حلقه یک Query جداگانه به دیتابیس میزند (مشکل معروف N+1 Query)؛ همیشه داده مرتبطی که قرار است استفاده شود را از قبل با Include بارگذاری کنید.
منبع و مطالعه بیشتر
خلاصه
EF Core رابطه یکبهچند و چندبهچند را از روی Convention نامگذاری Foreign Key خودکار تشخیص میدهد. برای جلوگیری از مشکل N+1 Query، داده مرتبط را با Include از قبل بارگذاری کنید. مرجع کامل: مستندات Relationships در EF Core، Microsoft Learn.
