آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش Configure Many-to-Many Relationships به کمک Fluent API در Entity Framework Core

دوره های مرتبط با این مقاله

آموزش نحوه تعیین روابط چند به چند به کمک Fluent API در Entity Framework Core

آموزش Configure Many-to-Many Relationships به کمک Fluent API در Entity Framework Core

در این بخش نحوه تعریف روابط چند به چند بین موجودیت ها را به کمک Fluent API آموزش می دهیم.

می خواهیم یک رابطه چند به چند بین موجودیت های Student و Course تعریف کنیم، به طوری که یک Student می تواند در چندین Course شرکت کند، و هر Course چندین Student دارد. تعریف این دو موجودیت مستقل از رابطه ای که دارند، به شکل زیر است:


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

رابطه ی چند به چند در دیتابیس به صورت یک جدول میانی که حاوی کلید خارجی به هردو جدول است، نشان داده می شود. در این جدول کلید حاصل ترکیب دو کلید خارجی است.


رابطه ی چند به چند در دیتابیس

قراداد نوشتاری برای تعریف روابط چند به چند در EF Core وجود ندارد. تنها راه تعریف چنین رابطه ای استفاده از Fluent API است.

در EF 6.x یا نسخه های قبلتر آن، EF API برای روابط چند به چند جدول میانی ایجاد می کرد. ما برای یک جدول میانی به موجودیت متناظری نیاز نداشتیم. (با این وجود می توانیم در EF 6 به طور صریح موجودیت میانی هم بسازیم).

در EF Core، این قابلیت هنوز پیاده سازی نشده. یعنی ما باید برای جدول میانی یک موجودیت بسازیم. موجودیت میانی برای دو موجودیت Student و Course باید شامل یک property کلید خارجی و یک navigation property برای هر کدام باشد.

مراحل تعریف یک رابطه چند به چند به این صورت است:


  • یک موجودیت میانی می سازیم که به ازای موجودیت های دو طرف رابطه، یک property کلید خارجی و یک navigation property داشته باشد.
  • یک رابطه ی یک به چند بین بین هر موجودیت و موجودیت میانی تعریف می کنیم. به این صورت که یک collection navigation property در موجودیت های دوسوی رابطه قرار می دهیم.
  • با کمک Fluent API، هردو کلید خارجی در موجودیت میانی را به صورت کلید اصلی ترکیبی تعیین می کنیم.

این مراحل را برای مثال خودمان انجام می دهیم. اول یک موجودیت StudentCourse به شکل زیر می سازیم:


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

موجودیت میانی StudentCourse حاوی دو navigation property از نوع Student و Course است و دو property کلید خارجی StudentId و CourseId به هریک دارد.

حال باید رابطه یک به چند را بین Student -> StudentCourse و Course -> StudentCourse تعریف کنیم. این کار را می توان با پیروی از قراردادهای نوشتاری تعریف رابطه ی یک به چند، انجام داد:


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; }
}

همان طور که در کد مشخص است، دو موجودیت Student و Course حاوی یک collection navigation property از نوع StudentCourse هستند. موجودیت StudentCourse که سمت دیگر این رابطه است حاوی navigation property و کلید خارجی به این دو موجودیت هست.

حال کلید های خارجی در موجودیت میانی StudentCourse باید کلید اصلی تعریف شوند. این کار با Fluent API قابل انجام است:


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 تعریف میکند.

این نحوه تعریف روابط چند به چند فقط زمانی ممکن است که موجودیت ها از قرادادهای نوشتاری تعریف رابطه یک به چند پیروی کنند. اگر نام property های کلید خارجی از قرادادهای نوشتاری پیروی نکند (مثلا SID به جای StudentId و CID به جای CourseId)، می توانید رابطه یک به چند را هم با Fluent API تعریف کنید:


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);

توجه: در نسخه های آینده ی EF Core قابلیتی اضافه می شود که مجبور نباشیم برای روابط چند به چند موجودیت میانی تعریف کنیم. این موضوع را می توانید در github دنبال کنید.

  • 226
  •    76
  • تاریخ ارسال :   1398/06/22

دانلود سورس کد دانلود فیلم آموزشی دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .