
یادگیری سی شارپ از مفاهیم پایه تا پروژه محور: شیگرایی، کار با SQL و LINQ، ORMها (Entity Framework)، ساخت پروژه مدیریت رستوران با گزارشات حرفهای و امکانات کامل!
مشاهده بیشتر
یادگیری MVC Core از مبانی تا پیشرفته: شیگرایی، Routing، Entity Framework، امنیت، تست یونیت، Razor، Ajax، و پروژههای کاربردی! یک دوره کامل برای تسلط بر توسعه وب با ASP.NET Core. به صورت حضوری و آنلاین!
مشاهده بیشترمشخصات مقاله
آموزش قراردادهای نوشتاری برای تعریف ارتباط یک به چند در Entity Framework Core
قراردادهای نوشتاری برای تعریف ارتباط یک به چند در Entity Framework Core
آموزش قراردادهای نوشتاری برای تعریف ارتباط یک به چند در Entity Framework Core
در بخش قبل به قراردادهای نوشتاری EF برای نگاشت موجودیت ها به object های درون Data Base پرداختیم. حال درمورد ارتباطات بین موجودیت ها که باعث ارتباط های یک به چند در بین جداول متناظر آن ها در Data Base می شود.
Entity Framework Core به همان صورت EF 6 روابط یک به چند را تعریف می کند. تنها تفاوت این است که EF Core یک ستون کلید خارجی می سازد و نامی مشابه navigation property خواهد داشت. (نه به صورت < NavigationPropertyName>_< PrimaryKeyPropertyName>
)
بیایید به روش های مختلف تعریف روابط یک به چند بین دو موجودیت Student و Grade بپردازیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Student { public int StudentId { get; set; } public string StudentName { get; set; } } public class Grade { public int GradeId { get; set; } public string GradeName { get; set; } public string Section { get; set; } } < button ></ button > |
جداولی که برای این دو موجودیت ساخته می شود به صورت زیر است، و جدول Students حاوی کلید خارجی GradeId است.

شیوه اول
می خواهیم یک ارتباط یک به چند ایجاد کنیم که مطابق آن چند دانشجو با یک نمره در ارتباطند. این ارتباط را می توان با قراردادن یک navigation property در موجودیت وابسته به شکل زیر ایجاد کرد. در اینجا موجودیت Student وابسته است و موجودیت Grade اصلی است.
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Student { public int Id { get; set; } public string Name { get; set; } public Grade Grade { get; set; } } public class Grade { public int GradeId { get; set; } public string GradeName { get; set; } public string Section { get; set; } }< button ></ button > |
در مثال بالا، موجودیت Student حاوی یک navigation property از نوع Grade است. این به ما اجازه می دهد یک Grade را به چندین موجودیت Student ربط دهیم که یک ارتباط یک به چند بین آن ها برقرار شود. در Data Base یک ارتباط یک به چند بین این دو برقرار می شود و جدول Students یک کلید خارجی nullable به نام GradeId دارد. EF Core یک shadow property برای کلید خارجی با نام GradeId در conceptual model می سازد که به ستون کلید خارجی GradeId در جدول Student نگاشت می شود.

نکته: Grade Property تعریف شده در Student، nullable است، پس ستون کلید خارجی آن در جدول Students نیز nullable است. می توانید NotNull بودن را با استفاده از fluent API تعیین کنید.
شیوه دوم
روش دوم قرار دادن یک collection navigation property درون موجودیت اصلی است به شیوه ای که دز زیر می بینید:
1 2 3 4 5 6 7 8 9 10 11 12 | public class Student { public int StudentId { get; set; } public string StudentName { get; set; } } public class Grade { public int GradeId { get; set; } public string GradeName { get; set; } public string Section { get; set; } public ICollection< Student > Students { get; set; } }< button ></ button > |
در مثال بالا، موجودیت Grade حاوی یک collection navigation property از نوع ICollection< Student >
است. وجود این پراپرتی به ما امکان می دهد چند موجودیت Student به Grade اضافه کنیم که نتیجه آن یک رابطه یک به چند خواهد بین آن دو خواهد بود.
روش سوم
یک روش دیگر تعریف رابطه ی یک به چند این است که navigation property را در هر دو سمت رابطه قرار دهیم. (ترکیب روش اول و دوم)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Student { public int Id { get; set; } public string Name { get; set; } public Grade Grade { get; set; } } public class Grade { public int GradeID { get; set; } public string GradeName { get; set; } public ICollection< Student > Students { get; set; } } < button ></ button > |
در مثال بالا، موجودیت Student حاوی یک navigation property از نوع Grade است. موجودیت Grade نیز حاوی یک collection navigation property ICollection < Student >
است. نتیجه این نوع تعریف ارتباط یک به چند بین این دو جدول است.
روش چهارم
می توان ارتباط را در دو سمت رابطه به طور کامل تعریف کرد، و کلید خارجی را در موجودیت وابسته گذاشت:
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Student { public int Id { get; set; } public string Name { get; set; } public int GradeId { get; set; } public Grade Grade { get; set; } } public class Grade { public int GradeId { get; set; } public string GradeName { get; set; } public ICollection< Student > Students { get; set; } }< button ></ button > |
در مثال بالا موجودیت Student حاوی یک کلید خارجی GradeId از نوع int و یک navigation property به نام Grade است. در سمت دیگر رابطه، موجودیت Grade حاوی یک collection navigation property ICollection< Student > است. این نحوه تعریف نیز یک رابطه ی یک به چند بین دو موجودیت ایجاد می کند و ستون کلید خارجی NotNull در جدول Student ایجاد می شود.

اگر می خواهید کلید خارجی GradeId را nullable تعریف کنید، نوع int را nullable تعریف کنید (Nullable
1 2 3 4 5 6 7 8 | public class Student { public int Id { get; set; } public string Name { get; set; } public int? GradeId { get; set; } public Grade Grade { get; set; } } < button ></ button > |
این شیوه های تعریف به طور خودکار به روابط یک به چند تبدیل می شوند. اگر موجودیت ها در یکی از شیوه های تعریف بالا نمی گنجند، از Fluent API برای ایجاد ارتباط یک به چند بین آن ها استفاده کنید.
با سلام وقت بخیر ممنون از آموزش خوبتون .
سلام دوست عزیز؛ خیلی خوشحالیم که آموزش براتون مفید بوده. موفق باشید!