您了解了一对多关系的约定。通常,您不需要配置一对多关系,因为EF Core包含足够的约定来自动配置它们。但是,如果您决定在Fluent API中使用所有EF配置以便于维护,则可以使用Fluent API配置一对多关系。
Entity Framework Core使用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; }
}
通过覆盖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);
这将在数据库中创建以下表:
让我们一步一步地理解上面的代码。
- 首先,我们需要开始使用一个实体类进行配置,
Student
或者Grade
。所以,modelBuilder.Entity<student>()
从Student
实体开始。 - 然后,指定实体包含名为的类型属性。
.HasOne<Grade>(s => s.Grade)StudentGradeGrade
- 现在,我们需要配置关系的另一端即
Grade
实体。在.WithMany(g => g.Students)
指定的Grade
实体类包括许多Student
实体。在这里,WithMany
推断集合导航属性。 - .HasForeignKey<int>(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
方法配置之间的级联删除Student
和Grade
实体,如下代码所示。
modelBuilder.Entity<Grade>()
.HasMany<Student>(g => g.Students)
.WithOne(s => s.Grade)
.HasForeignKey(s => s.CurrentGradeId)
.OnDelete(DeleteBehavior.Cascade);
该OnDelete()
方法级联删除行为使用的DeleteBehavior
参数。您可以根据需要指定以下任何DeleteBehavior
值。
- 级联:删除主体实体时将删除从属实体。
- ClientSetNull:依赖实体中的外键属性值将设置为null。
- 限制:防止级联删除。
- SetNull:从属实体中的外键属性值将设置为null。