通八洲科技

EF Core TPH (Table-Per-Hierarchy) 怎么配置 EF Core TPH继承方法

日期:2025-12-24 00:00 / 作者:星降
EF Core 的 TPH 是默认继承策略,只需将基类设为 abstract、在 OnModelCreating 中配置 HasDiscriminator 及 HasValue、仅注册基类 DbSet 即可;派生类不可调用 ToTable,主键须统一,迁移后应仅生成一张含 Discriminator 列的表。

EF Core 的 TPH(Table-Per-Hierarchy)是默认继承策略,配置起来其实很直接——不需要额外声明策略,只要不显式切换成 TPT 或 TPC,它就自动生效。关键在于正确设置鉴别器(Discriminator)列,并确保所有派生类共用一张表。

明确基类为抽象类并定义公共属性

基类通常设为 abstract,包含所有子类共有的字段(如 Id、Name),避免重复建模:

在 OnModelCreating 中配置 Discriminator 列

这是 TPH 的核心操作。通过 Fluent API 指定鉴别器字段名和各类型的值:

DbSet 只需注册基类(推荐做法)

DbContext 中只需声明基类的 DbSet,EF Core 会自动把所有派生类型的数据读写到同一张表:

避免常见陷阱

TPH 看似简单,但几个细节容易出错:

基本上就这些。TPH 不复杂但容易忽略鉴别器配置和 DbSet 声明逻辑,配对之后就能自然支持多态查询,比如 context.Animals.OfType()