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
相关产品推荐
相关产品推荐

