
پیادهسازی روابط یک به یک در EF Core
در این آموزش به روابط یک به یک در EF Core به زبان ساده میپردازیم. ارتباط یک به یک (One-to-One) زمانی است که هر رکورد در یک جدول تنها با یک رکورد در جدول دیگر مرتبط است. به عنوان مثال، فرض کنید در یک سیستم مدیریت دانشجویان، هر دانشجو (Student) دقیقاً یک کارت دانشجویی (StudentCard) داشته باشد. مانند تصویر زبر
- ارتباط یک به یک وقتی استفاده میشود که هر رکورد در یک جدول فقط به یک رکورد در جدول دیگر مرتبط باشد.
- از ارتباط یک به یک برای جدا کردن دادههای اضافی یا اختیاری، محافظت از اطلاعات حساس، و جلوگیری از تکرار دادهها استفاده میشود.
- ارتباط یک به یک به مرتبتر شدن پایگاه داده و امنیت بیشتر کمک میکند.
در چه زمانی از ارتباط یک به یک استفاده کنیم؟
ارتباط یک به یک وقتی استفاده میشود که هر رکورد در یک جدول فقط به یک رکورد در جدول دیگر مرتبط باشد. از این روش برای جدا کردن دادههای اضافی یا اختیاری، محافظت از اطلاعات حساس، و جلوگیری از تکرار دادهها استفاده میشود. همچنین اگر بخشی از دادهها چرخه عمر متفاوتی داشته باشند یا کمتر استفاده شوند، میتوان آنها را در یک جدول جدا ذخیره کرد. این کار به مرتبتر شدن دیتابیس و امنیت بیشتر کمک میکند.
تعریف مدل ها
ابتدا کلاسهای 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) به موجودیت مرتبط دیگر دسترسی داشته باشید.































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