ارتباط میان موجودیت‌ها در EF Core – جلسه ۴۷

EF Core Relationship

در جلسه 47ام از آموزش ASP.NET Core MVC به بررسی ارتباط میان موجودیت‌ها در EF Core که به آن EF Core Relationship نیز گفته میشود خواهیم پرداخت. به طور کلی موجودیت‌‌ها در EF Core و پایگاه داده می توانند به سه حالت یک-به-یک، یک-به-چند و چند-به-چند با هم در ارتباط باشند.

EF Core Relationship Types

ارتباط یک-به-یک/صفر موجودیت‌ها در EF Core

در صورتی که یک رکورد از موجودیت A با تنها یک/صفر رکورد از موجودیت B در ارتباط باشد، یک رابطه یک-به-یک/صفر ایجاد میگردد. فرض کنید هر بازیگر تنها یک جنسیت خواهد داشت (مرد،زن و غیره) در نتیجه موجودیت بازیگر (Actor) با موجودیت جنسیت (Gender) یک رابطه یک به یک/صفر خواهد داشت. در صورتی که کلید خارجی جنسیت در موجودیت بازیگر یک فیلد الزامی باشد، این رابطه به صورت خودکار به رابطه یک-به-یک تبدیل خواهد شد.

One-to-One relationship

همانگونه که مشاهده میکنید، برای برقراری این رابطه میبایست تغییرات مورد نظر را در Domain Models اعمال نماییم. پس ابتدا درون موجودیت اول (در این مثال Actor) فیلد کلید اصلی (Primary Key) موجودیت دوم (در این مثال Gender) را به عنوان کلید خارجی (Foreign Key) اضافه میکنیم. سپس در همان موجودیت بازیگر، موجودیت جنسیت را به صورت مجازی به عنوان یک فیلد اضافه میکنیم. برای تعیین کلید خارجی میتوانیم از خصوصیت ForeignKey استفاده نماییم.

سپس در موجودیت دوم (Gender)، موجودیت اول (Actor) را به عنوان یک فیلد مجازی اضافه میکنیم تا ارتباط مورد نظر برقرارگردد. این ارتباط در زمان Migration به پایگاه داده رابطه‌ایی نیز منتقل میگردد.

ارتباط یک-به-چند موجودیت‌ها در EF Core

زمانی که یک رکورد از موجودیت A با چندین رکورد از موجودیت B در ارتباط باشد، یک رابطه یک-به-چند برقرار میگردد. فرض کنید هر بازیگر میتواند چندین جایزه را برنده شود. در نتیجه موجودیت بازیگر با موجودیت جوایز یک رابطه یک-به-چند برقرار میکند.

One-to-many relationship

همانگونه که مشاهده میکنید، کلید اصلی (PK) در موجودیت Actor به عنوان کلید خارجی (FK) در موجودیت Award قرار دارد. همچنین موجودیت Actor به عنوان یک فیلد مجازی به همراه خصوصیت ForeignKey در مدل جوایز اضافه شده است. اما این بار برای برقراری رابطه یک-به-چند، میبایست موجودیت Award درون مدل Actor به صورت ICollection اضافه گردد. همچنین این موجودیت همچنان باید به صورت مجازی به مدل Actor اضافه گردد.

ارتباط چند-به-چند در EF Core

در حالتی که چند رکورد از موجودیت A با چنید رکورد از موجودیت B در ارتباط باشد، یک رابطه چند-به-چند برقرار میگردد. فرض کنید یک بازیگر میتواند در چندین فیلم ایفای نقش کند، همچنین هر فیلم میتواند چندین بازیگر داشته باشد. پس در این مثال میان موجودیت‌های بازیگر و فیلم یک رابطه چند به چند وجود دارد.

برای پیاده‌سازی این رابطه در EF Core تنها نیاز میباشد که هر موجودیت به عنوان یک فیلد درون موجودیت دیگر به صورت مجازی و ICollection تعریف شود. البته در زمان Migration در پایگاه داده این ارتباط توسط جدول ثالث برقرار میگردد.

many-to-many relationship

همانگونه که مشاهده میکنید در زمان Migration جدول ثالثی ایجاد میگردد (ActorMovie) که حاوی MovieID و ActorID به عنوان کلیدهای خارجی و اصلی میباشد.

سورس مثال فوق جهت درک بهتر ارتباط میان موجودیت‌ها در EF Core درون اکانت GitHub ما از اینجا قابل مشاهده میباشد.

توسعه و آماده سازی پروژه اصلی این دوره آموزشی

در این جلسه، همچنین تغییراتی در پروژه اصلی این دوره آموزشی اعمال نمودیم تا آنرا برای کار با پایگاه داده و ادامه روند آموزشی مهیا سازیم. ضمنا میان موجودیت‌های Cost و Category یک ارتباط یک-به-یک برقرار نمودیم. این رابطه مربوط به هر رکورد هزینه (Cost) میباشد که دارای یک دسته‌بندی (Category) خواهد بود.

در نتیجه مدل Cost را به صورت زیر تغییر دادیم.

    public class Cost
    {
        [Key]
        public int ID { get; set; }
        [Column(TypeName = "decimal(18, 2)")]
        [Required]
        public decimal Amount { get; set; }
        [Required]
        public DateTime RegisteredDate { get; set; }
        [MaxLength(150)]
        public string Comment { get; set; }
        [Required]
        public int CategoryID { get; set; }
        [ForeignKey(nameof(CategoryID))]
        public virtual Category Category { get; set; }
        public PaymentMethods PaymentMethod { set; get; }
    }

همچنین مدل Category را به صورت زیر تغییر دادیم تا ارتباط مورد نظر برقرار گردد.

    public class Category
    {
        [Key]
        public int ID { get; set; }
        [Required]
        public string CategoryName { get; set; }
        public string Description { get; set; }
        [Required]
        public CategoryActiveOptions Active { get; set; }
        public virtual Cost Cost { get; set; }
    }

ضمنا برای PaymentMethod یک کلاس enum ایجاد کردیم که همانگونه که مشاهده کردید در مدل Cost نوع فیلد PaymentMethod از نوع enum ایجاد شده (PaymentMethods) میباشد که در زیر کد آنرا میتوانید مشاهده کنید.

    public enum PaymentMethods
    {
        Cash,
        Debit,
        Credit
    }
}

در صورت نیاز به جزئیات بیشتر، میتوانید ویدئو آموزشی این جلسه را تماشا نمایید. همچنین برای آگاهی از جلسات بعدی این دوره آموزشی، ما را در اینستاگرام، تلگرام، یوتیوب و آپارات دنبال کنید. ضمنا لیست کامل جلسات در این قسمت در دسترس شما میباشد و سورس کد این جلسه را میتوانید از GitHub ما دانلود نمایید.

تماشای ویدیو در یوتیوب ما

دانلود اسلایدهای آموزشی این جلسه از اینجا

برچسب ها

3.5 2 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
4 نظرات
قدیمی‌ترین
تازه‌ترین بیشترین رأی
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
امیر
امیر
1 سال قبل

سلام وقتتون بخیر ، تو این جلسه ابتدا که درمورد رابطه ها صحبت کردید ، بعد گفتید که رابطه بین فیلم و بازیگر بصورت چند به چنده ، ولی توی آموزش اصن اون جدول واسط رو ایجاد نکرید ، میخواستم ببینم این به چه صورت میشه و آیا فراموش شده این بخش ؟

امیر
امیر
1 سال قبل
پاسخ به  امین صیفوری

خیلی ممنون ، چون تو آموزش دیدم که یک جدول ثالثی هم داریم فک کردم باید دستی ایجاد بشه ، نمیدونستم خوده اینتی کوره میسازش ، ممنون از پاسخ گوییتون

حسین مدرسی
حسین مدرسی
1 سال قبل

ممنون از آموزش خوبتون

4
0
افکار شما را دوست داریم، لطفا نظر دهید.x