در این پست از وبسایت پرووید در رابطه با پیکربندی رابطه های Many-to-Many در EF Core با استفاده از Fluent API #2 صحبت خواهیم کرد. تکنولوژی Entity Framework Core نسل بعدی Entity Framework است که توسط مایکروسافت معرفی شده است.

در قسمت قبلی از این آموزش در رابطه با پیکربندی رابطه های Many-to-Many در EF Core با استفاده از Fluent API صحبت کردیم.

خوب بیاید این موضوع را پیاده سازی کنیم. در ابتدا یک joining entity class با نام StudentCourse را شبیه زیر تعریف می کنیم.

public class StudentCourse
{
    public int StudentId { get; set; }
    public Student Student { get; set; }

    public int CourseId { get; set; }
    public Course Course { get; set; }
}

این joining entity class که StudentCourse نام دارد حاوی یک reference navigation property هایی را به Student و Course است. همچنین foreign key property هایی رو یعنی StudentId و CourseId را تعریف کرده ایم. در رابطه با مفاهیم

بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core دیدن کنید.

در ادامه باید دو relationship از نوع one-to-many را به ترتیب بین Student و StudentCourse و همچنین Course و StudentCourse پیاده سازی کنیم. این موضوع را می توانیم با استفاده از convention هایی که برای پیاده‌سازی relationship های one-to-many در Entity Framework Core قرار دارند انجام بدهیم. کد زیر این موضوع را نشان می دهد.

public class Student
{
    public int StudentId { get; set; }
    public string Name { get; set; }

    public IList<StudentCourse> StudentCourses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public string Description { get; set; }

    public IList<StudentCourse> StudentCourses { get; set; }
}

همانطور که در کد بالا می بینید entity های Student و Course شامل collection navigation property هایی از نوع StudentCourse می باشند. علاوه بر این از قبل StudentCourse حاوی foreign key property و reference navigation property برای هر دو Entity یعنی Student و Course می بود. بنابراین با این حساب ما توانسته ایم یک relationship از نوع one-to-many را بین Student و StudentCourse و همچنین Course و StudentCourse ایجاد کنیم.

بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.0

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی شروع به کار با Entity Framework Core 2.0 دیدن کنید.

در ادامه با استفاده از Fluent API در StudentCourse هر دوی foreign key property ها را به عنوان composite primary key تنظیم می کنیم. این موضوع در کد زیر نشان داده شده است.

public class SchoolContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=.\\SQLEXPRESS;Database=EFCore-SchoolDB;Trusted_Connection=True");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.StudentId, sc.CourseId });
    }
    
    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
    public DbSet<StudentCourse> StudentCourses { get; set; }
}

در کدی که در قسمت بالا مشاهده می کنید دستور modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.StudentId, sc.CourseId }) باعث می ‌شود که StudentId و CourseId به عنوان composite primary key در نظر گرفته بشوند.

این نحوه پیاده سازی یک relationship از نوع many-to-many بین دو entity بود که از convention های مربوط به relationship‌ های one-to-many استفاده می‌کردند. اما فرض کنید که این foreign key property ها از convention ها استفاده نکرده بودند. برای مثال از کلمه ی SID به جای StudentId و CID به جای CourseId استفاده شده بو.د به منظور انجام این کار نیز می توانید با استفاده از Fluent API و پیکربندی که در کد زیر مشاهده می کنید این موضوع را انجام بدهید. به منظور کسب اطلاعات بیشتر در رابطه با convention ها آموزش بررسی Convention ها در Entity Framework Core #1 را مطالعه کنید.

modelBuilder.Entity<StudentCourse>().HasKey(sc => new { sc.SId, sc.CId });

modelBuilder.Entity<StudentCourse>()
    .HasOne<Student>(sc => sc.Student)
    .WithMany(s => s.StudentCourses)
    .HasForeignKey(sc => sc.SId);


modelBuilder.Entity<StudentCourse>()
    .HasOne<Course>(sc => sc.Course)
    .WithMany(s => s.StudentCourses)
    .HasForeignKey(sc => sc.CId);

دقت کنید که تیم توسعه Entity Framework Core در ورژنهای بعدی قابلیت‌ هایی را اضافه خواهد کرد که نیازمند تعریف یک joining entity class برای پیاده ‌سازی relationship های many-to-many نباشیم. امیدواریم که این آموزش از وبسایت پرووید نیز مورد توجه تمامی دوستان عزیز قرار گرفته باشد. می توانید به منظور یادگیری هرچه بهتر مباحث مربوط به Entity Framework Core از بسته های جامع آموزش وبسایت پرووید استفاده کنید.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *