کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش نحوه تعیین Convention One To Many را به کمک Fluent API در Entity Framework Core

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

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

معمولا برای تعریف روابط یک به چند بین موجودیت ها، قراردادهای نوشتاری EF Core کافی است. اما اگر می خواهید همه ی config های خود را با استفاده از Fluent API انجام دهید، تعریف روابط یک به چند هم ممکن است.

دو موجودیت Student و Grade را در نظر بگیرید که هر موجودیت Grade حاوی چند موجودیت Student است.


public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CurrentGradeId { 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; }
    public ICollection< Student > Students { get; set; }
}

در کلاس Context متد OnModelCreating را override کنید و به شکل زیر رابطه یک به چند بین این دو موجودیت تعیین کنید:


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< Student >()
            .HasOne< Grade >(s => s.Grade)
            .WithMany(g => g.Students)
            .HasForeignKey(s => s.CurrentGradeId);
    }
    public DbSet< Grade > Grades { get; set; }
    public DbSet< Student > Students { get; set; }
}

در مثال بالا این قسمت کد رابطه یک به چند را بین Student و Grade تعریف می کند:


modelBuilder.Entity< Student >()
    .HasOne< Grade >(s => s.Grade)
    .WithMany(g => g.Students)
    .HasForeignKey(s => s.CurrentGradeId);

و در نهایت جدول هایی زیر را در دیتابیس می سازد:


روابط یک به چند را با  Fluent API در Entity Framework Core

بیایید کد بالا را مرحله به مرحله تحلیل کنیم.


  • ابتدا باید با یکی از موجودیت های Student یا Grade کار را شروع کنیم. modelBuilder.Entity< Student >() کا را با موجودیت Student شروع می کند.
  • سپس، کد .HasOne< Grade >(s => s.Grade) تعیین می کند که موجودیت Student یک پراپرتی از نوع Grade با نام Grade در خود دارد.
  • حال باید سمت دیگر رابطه را config کنیم. کد .WithMany(g => g.Students) تعیین می کند که موجودیت Grade حاوی چندین موجودیت Student است. در اینجا WithMany یک collection navigation property می خواهد.
  • کد .HasForeignKey(s => s.CurrentGradeId); تعیین می کند نام کلید خارجی CurrentGradeId باشد. این اختیاری است. فقط زمانی از آن استفاده کنید که در کلاس وابسته کلید خارجی Id property دارید.

شکل زیر این مراحل را نشان می دهد:


روابط یک به چند را با  Fluent API در Entity Framework Core

راه دیگر این است که تعریف رابطه را از موجودیت Grade شروع کنیم:


modelBuilder.Entity< Grade >()
    .HasMany< Student >(g => g.Students)
    .WithOne(s => s.Grade)
    .HasForeignKey(s => s.CurrentGradeId);

تنظیم Cascade Delete با استفاده از Fluent API

Cascade Delete به طور خودکار ردیف child را هنگام حذف کردن ردیف مرجع آن، پاک می کند. برای مثال، اگر یک Grade پاک شود، همه ی Student ها در آن Grade از دیتابیس پاک می شوند.

از متد OnDelete برای کانفیگ این موضوع استفاده کنید:


modelBuilder.Entity< Grade >()
    .HasMany< Student >(g => g.Students)
    .WithOne(s => s.Grade)
    .HasForeignKey(s => s.CurrentGradeId)
    .OnDelete(DeleteBehavior.Cascade);

متد OnDelete() از پارامتر DeleteBehavior استفاده می کند. مقادیر DeleteBehavior زیر را می توان تعیین کرد:


  • Cascade : موجودیت های وابسته با حذف موجودیت اصلی، حذف می شوند.
  • ClientSetNull: در موجودیت های وابسته مقدار کلید خارجی null میشود.
  • Restrict: اجازه Cascade delete نمی دهد.
  • SetNull: در موجودیت های وابسته مقدار کلید خارجی null میشود.
1398/06/22 3170 755
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...