站点图标 江湖人士

Entity Framework Core使用Fluent API 配置数据库表一对多关系

EF Core获取上下文SQL语句

EF Core获取上下文SQL语句

您了解了一对多关系约定。通常,您不需要配置一对多关系,因为EF Core包含足够的约定来自动配置它们。但是,如果您决定在Fluent API中使用所有EF配置以便于维护,则可以使用Fluent API配置一对多关系。

Entity Framework Core使用Fluent API轻松配置关系。考虑下面StudentGrade类,其中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; }
}

通过覆盖OnModelCreating上下文类中的方法,使用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<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; }
}

在上面的示例中,以下代码段配置了一对多关系:

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

这将在数​​据库中创建以下表:

让我们一步一步地理解上面的代码。

下图说明了上述步骤:

或者,您可以开始配置与Grade实体而不是实体的关系Student,如下所示。

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

使用Fluent API配置级联删除

删除相关父行时,级联删除会自动删除子行。例如,如果Grade删除了a ,那么Students该等级中的所有内容也应自动从数据库中删除。

使用OnDelete方法配置之间的级联删除StudentGrade实体,如下代码所示。

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

OnDelete()方法级联删除行为使用的DeleteBehavior参数。您可以根据需要指定以下任何DeleteBehavior值。

退出移动版