在EF Core的 TPH继承层次结构中,如何共享外键?

编程语言 2026-07-10

我有一个 Events 基类,它包含一个抽象的子类,而这个子类本身又有两个(现在)子类:

public class Event {
}

public abstract class FooEvent : Event {
    public Foo? Foo { get; set; }
}

public class BarEvent : FooEvent { }

public class BazEvent : FooEvent { }

(除了 FooEvent 之外的所有类都具有其他属性,且都按预期/需要的方式工作。)

EF正在生成三列外键:FooEventIdBarEvent_FooEventIdBazEvent_FooEventId。我非常希望所有的 FooEvent 实体都共享同一个 FooEventId 列,用于指向 Foo 表的外键,最好在 FooEvent 类中使用一个特性,这样其他子类就能自动处理。

理想情况下,EF会生成类似于

CREATE TABLE Entity
(
    EntityId INT,
    FooId INT
)

的内容,而不是它当前所做的:

CREATE TABLE Entity
(
    EntityId INT,
    FooId INT,
    BarEvent_FooId INT,
    BazEvent_FooId INT
)

理想的解决方案是让我能够添加一个新的(实际上是空的!)类 public class BuxEvent : FooEvent {},完全不需要迁移(当然,如果 BuxEvent 有其他属性,就需要迁移;这是可以理解的)。

这个问题该如何实现?

解决方案

原来我忘记在EF中注册 FooEvent。进行此注册后问题得到解决:它只创建了一个 FooId 列,正如所期望的那样。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章