EF Core 的 TPH 是默认继承策略,只需将基类设为 abstract、在 OnModelCreating 中配置 HasDiscriminator 及 HasValue、仅注册基类 DbSet 即可;派生类不可调用 ToTable,主键须统一,迁移后应仅生成一张含 Discriminator 列的表。
EF Core 的 TPH(Table-Per-Hierarchy)是默认继承策略,配置起来其实很直接——不需要额外声明策略,只要不显式切换成 TPT 或 TPC,它就自动生效。关键在于正确设置鉴别器(Discriminator)列,并确保所有派生类共用一张表。
基类通常设为 abstract,包含所有子类共有的字段(如 Id、Name),避免重复建模:
public abstract class Animal { public int Id { get; set; } public string Name { get; set; } }
Cat.Lives 或 Dog.Breed
这是 TPH 的核心操作。通过 Fluent API 指定鉴别器字段名和各类型的值:
modelBuilder.Entity().HasDiscriminator("AnimalType")
.HasValue("Cat") 和 .HasValue("Dog") 映射具体类型string、int 或枚举,推荐用字符串便于调试DbContext 中只需声明基类的 DbSet,EF Core 会自动把所有派生类型的数据读写到同一张表:
public DbSet Animals { get; s
et; }DbSet 或 DbSet —— 即使写了,查询时也仍走同一张表Animals),不是类型名TPH 看似简单,但几个细节容易出错:
ToTable(),否则 EF Core 会降级为 TPT 模式Code),要确保它们映射到同一列,可用 HasColumnName("Code") 统一指定基本上就这些。TPH 不复杂但容易忽略鉴别器配置和 DbSet 声明逻辑,配对之后就能自然支持多态查询,比如 context.Animals.OfType。