مشخصات مقاله
-
755
-
0.0
-
3170
-
0
-
0
آموزش نحوه تعیین 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);و در نهایت جدول هایی زیر را در دیتابیس می سازد:
بیایید کد بالا را مرحله به مرحله تحلیل کنیم.
- ابتدا باید با یکی از موجودیت های 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 دارید.
شکل زیر این مراحل را نشان می دهد:
راه دیگر این است که تعریف رابطه را از موجودیت 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 میشود.