You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6+EF中继承类未在SQL Server显示的原因排查

为什么EF Core只生成了Food表而没有子类对应的表?

这是因为EF Core默认采用**TPH(每个层次结构一张表)**的继承映射策略——所有继承自Food的子类数据都会存储在同一个Food表中,通过自动生成的Discriminator列来区分不同的子类类型。哪怕你在DbContext里声明了各个子类的DbSet,默认也不会为它们创建单独的表。

如果你想要每个子类对应独立的表,可以切换成以下两种继承策略:

1. TPT(每个类型一张表)

这种策略会为父类Food和每个子类分别生成独立的表,子类表只包含自身独有的属性,通过外键关联到父类表。

配置方式

  • 数据注解:直接在子类上标记表名特性
[Table("Meats")]
public class Meat : Food { /* 子类专属属性 */ }

[Table("Dairies")]
public class Dairy : Food { /* 子类专属属性 */ }

[Table("Breads")]
public class Breads : Food { /* 子类专属属性 */ }

[Table("NotDairyOrMeats")]
public class NotDairyOrMeat : Food { /* 子类专属属性 */ }
  • Fluent API:在DbContext的OnModelCreating方法中配置
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Food>().ToTable("Foods");
    modelBuilder.Entity<Meat>().ToTable("Meats");
    modelBuilder.Entity<Dairy>().ToTable("Dairies");
    modelBuilder.Entity<Breads>().ToTable("Breads");
    modelBuilder.Entity<NotDairyOrMeat>().ToTable("NotDairyOrMeats");
}

2. TPCC(每个具体类一张表)

这种策略会为每个子类生成独立的表,每张表包含父类的所有属性+自身独有的属性,父类Food不会生成对应的表。

配置方式(仅支持Fluent API)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 标记父类不生成实体表
    modelBuilder.Entity<Food>().HasNoKey().ToView(null);
    
    modelBuilder.Entity<Meat>().ToTable("Meats");
    modelBuilder.Entity<Dairy>().ToTable("Dairies");
    modelBuilder.Entity<Breads>().ToTable("Breads");
    modelBuilder.Entity<NotDairyOrMeat>().ToTable("NotDairyOrMeats");
}

最后一步:更新数据库

修改完继承策略配置后,需要生成新的迁移并同步到SQL Server:

Add-Migration UpdateInheritanceStrategy
Update-Database

内容的提问来源于stack exchange,提问作者avihus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:50:34