پیاده‌سازی روابط یک به یک در EF Core

در این آموزش به روابط یک به یک در EF Core به زبان ساده میپردازیم. ارتباط یک به یک (One-to-One) زمانی است که هر رکورد در یک جدول تنها با یک رکورد در جدول دیگر مرتبط است. به عنوان مثال، فرض کنید در یک سیستم مدیریت دانشجویان، هر دانشجو (Student) دقیقاً یک کارت دانشجویی (StudentCard) داشته باشد. مانند تصویر زبر

روابط یک به یک در EF Core

روابط یک به یک در EF Core

  • ارتباط یک به یک وقتی استفاده می‌شود که هر رکورد در یک جدول فقط به یک رکورد در جدول دیگر مرتبط باشد.
  • از ارتباط یک به یک برای جدا کردن داده‌های اضافی یا اختیاری، محافظت از اطلاعات حساس، و جلوگیری از تکرار داده‌ها استفاده می‌شود.
  • ارتباط یک به یک به مرتب‌تر شدن پایگاه داده و امنیت بیشتر کمک می‌کند.

در چه زمانی از ارتباط یک به یک استفاده کنیم؟

ارتباط یک به یک وقتی استفاده می‌شود که هر رکورد در یک جدول فقط به یک رکورد در جدول دیگر مرتبط باشد. از این روش برای جدا کردن داده‌های اضافی یا اختیاری، محافظت از اطلاعات حساس، و جلوگیری از تکرار داده‌ها استفاده می‌شود. همچنین اگر بخشی از داده‌ها چرخه عمر متفاوتی داشته باشند یا کمتر استفاده شوند، می‌توان آن‌ها را در یک جدول جدا ذخیره کرد. این کار به مرتب‌تر شدن دیتابیس و امنیت بیشتر کمک می‌کند.

تعریف مدل ها

ابتدا کلاس‌های Student و StudentCard را تعریف می‌کنیم. که نمایانگر جداول دیتابیس هستند.

مدل Student

public class Student
{
    public int Id { get; set; }
    public required string Name { get; set; }
    public required string Email { get; set; }
    //Navigation Property
    public required StudentCard StudentCard { get; set; }
}

مدل StudentCard

public class StudentCard
{
    public int Id { get; set; }
    public required string CardNumber { get; set; }
    public required DateTime RegisterCard { get; set; }
    //foreign key
    public required int StudentId { get; set; }
    //Navigation Property
    public required Student Student { get; set; }
}

تعریف ویو مدل ها

ویو مدل Student

public class StudentViewModel
{
    public int Id { get; set; }
    public required string Name { get; set; }
    public required string Email { get; set; }
    public required StudentCardViewModel StudentCard { get; set; }
}

ویو مدل StudentCard

public class StudentCardViewModel
{
    public required string CardNumber { get; set; }
    public required DateTime RegisterCard { get; set; }
}

تنظیمات DbContext

ثبت مدل ها

public DbSet<Student> Students { get; set; }
public DbSet<StudentCard> StudentCards { get; set; }

افزودن تنطیمات ارتباط یک به یک

modelBuilder.Entity<Student>()
    .HasOne(s => s.StudentCard)
    .WithOne(s => s.Student)
    .HasForeignKey<StudentCard>(sc => sc.StudentId)
    .OnDelete(DeleteBehavior.Cascade);
}
  • متد HasOne: نشان می‌دهد که پراپرتی Student یک ارتباط دارد.
  • متد WithOne: مشخص می‌کند که این ارتباط یک به یک است.
  • متد HasForeignKey: کلید خارجی در جدول StudentCard را مشخص می‌کند که به Student متصل است.
  • متد OnDelete: اگر از Cascade Delete استفاده شود. حذف پراپرتی اصلی، پراپرتی وابسته را نیز حذف می‌کند.

کلید خارجی در کدام جدول باید تعریف شود؟

در سناریوی ارتباط یک به یک (One-to-One)، کلید خارجی در جدولی تعریف می‌شود که به عنوان وابسته در نظر گرفته می‌شود، و این بستگی به طراحی و سناریوی کسب‌وکاری دارد. در مثال Student و StudentCard، دلیل اینکه کلید خارجی در جدول StudentCard تعریف شده، این است که:

Student به عنوان موجودیت اصلی شناخته می‌شود، زیرا هر دانشجو می‌تواند بدون کارت دانشجویی وجود داشته باشد. اما هر کارت دانشجویی وابسته به یک دانشجو است. و بدون دانشجو معنا ندارد. بنابراین، کلید خارجی (StudentId) در موجودیت وابسته (StudentCard) قرار می‌گیرد. تا نشان دهد این رکورد به کدام دانشجو مرتبط است.

Navigation Property چیست؟

Navigation Property برای ارتباط بین جداول (یا Entityها) در دیتابیس استفاده می‌شود. این ویژگی به شما اجازه می‌دهد که از یک موجودیت (Entity) به موجودیت مرتبط دیگر دسترسی داشته باشید.

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی پیاده‌سازی روابط یک به یک در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه پیاده‌سازی روابط یک به یک در EF Core در شبکه‌های اجتماعی

نظرات ارزشمند شما

نظرات شما برای ما ارزشمند است و آنها را میخوانیم و پاسخ میدهیم.

تصویر مرتضی فاضل

یک خسته نباشید ویژه خدمت دوست و استاد محترم بخاطر اموزش های روان و عالی شما، با اشتیاق منتظر قسمت های بعدی هستیم

تصویر محمدرضا احدیان

ممنون از انرژی + شما به امید خدا فردا قسمت جدید را منتشر میکنیم.

تصویر رضا فلاح

سلام استاد گرامی
طبق اطلاعات و مهارت قبلی; ما جداول را در SQL درست می کردیم و حتی روابط بین جداول را هم با View ها در دیتابیس ایجاد می کردیم. سپس با استفاده از Entity این جداول را در سی شارپ به مدل تبدیل می نمودیم که در فایل appconfig ذخیره می شد.
حال طبق آموزش های شما ما همواره داریم از مدل یا ویومدل به جداول SQL می رسیم. روند کار همیشه همین خواهد بود یا روش انتقال از دیتابیس به EF را هم خواهیم داشت؟
اهمیت این موضوع در این است که: ۱- گاهی ایجاد جداول و روابط فیمابین در دیتا بیس راحت تر هست و ۲- ممکن است یک فایل SQL داشته باشیم که مجبور شویم از روی آن مدل ها را بسازیم!
ممنون میشم راهنمایی کنید

تصویر محمدرضا احدیان

سلام رویکرد ما در این دوره Code First میباشد. ولی در یکی از قسمت ها مدل Database First هم برسی میکنیم. نکته مهم این است که شما اگر Code First را بلد باشید با یک آموزش کوتاه ۱۵ دقیقه ای به Database First تسلط پیدا میکنید. اما برعکس آن صدق نمیکند.

تصویر رضا فلاح

ممنون از راهنمایی هاتون ✔
انشاله زودتر از این بخش ۱۵ دقیقه ای Database First هم بتونیم بهره مند بشیم.

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.