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。
User Review
0 (0 votes)
本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

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

扫码关注【江湖人士】公众号,您会获得关于国外被动收入的最新资讯

WA付费会员QQ群:387027533,加这个群需要回答您的WA会员名,待核实后予以通过

普通QQ交流群:178758794,可分享交流建站的各类经验和知识

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 × 3 =