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

您了解了一对多关系约定。通常,您不需要配置一对多关系,因为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);

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

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

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

  • 首先,我们需要开始使用一个实体类进行配置,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) 指定外键属性的名称。这是可选的。仅在依赖类中具有外键属性时才使用它。

下图说明了上述步骤:

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

或者,您可以开始配置与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值。

  • 级联:删除主体实体时将删除从属实体。
  • ClientSetNull:依赖实体中的外键属性值将设置为null。
  • 限制:防止级联删除。
  • SetNull:从属实体中的外键属性值将设置为null。

加入电报群

【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/27127.html

扫码加入电报群,让你获得国外网赚一手信息。

文章标题:Entity Framework Core使用Fluent API 配置数据库表一对多关系

(0)
江小编的头像江小编
上一篇 2019-03-20 23:42
下一篇 2019-03-22 12:56

热门推荐

Leave a Reply

Sending

国外老牌便宜域名服务商Namecheap注册com域名大优惠,抢到就赚到,优惠码:NEWCOM698
$5.98/年
直达官网