Entity Framework Code First TPH 继承 - 不同的子类可以共享一个字段吗?

gle*_*ron 5 c# entity-framework table-per-hierarchy ef-code-first

我有一个使用 Entity Framework Code First 创建的实体框架模型,该模型使用每个层次结构表继承,其中结构看起来有点像这样:

public abstract class BaseState 
{
    public int Id { get; set; }

    public string StateName { get; set; }

    // etcetera
}


public class CreatedState : BaseState
{
    public User Owner { get; set; }

}

public class UpdatedState : BaseState
{
    public User Owner { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在创建的内容在我拥有并存储的BaseStates表中。但考虑到没有一个类会同时是 a和 an ,似乎对两者都使用一个单一的类是合乎逻辑的。这也将使跟踪数据库变得更容易。Owner_IdOwner_Id1CreatedStateUpdatedStateOwner_Id

我的基本问题是:Code First EF4 可以实现这一点吗?

我尝试映射列:

public class CreatedState : BaseState
{
    [Column("OwnerId")]
    public User Owner { get; set; }

}

public class UpdatedState : BaseState
{
    [Column("OwnerId")]
    public User Owner { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这似乎没有效果。

然后我尝试创建一个共享父类,无论如何这可能是更正确的面向对象:

public abstract class OwnedState : BaseState
{
     public User Owner { get; set; }
}


public class CreatedState : OwnedState
{

}

public class UpdatedState : OwnedState
{

}
Run Code Online (Sandbox Code Playgroud)

再说一次,没有骰子。或者,更令人担忧的是,当我可以看到它确实工作的类之间没有任何区别时,这似乎在某些情况下起作用,而在其他情况下不起作用(显然我的真实配置稍微复杂一些)。

编辑有关失败原因的更多详细信息:我有两个字段的行为方式与上面描述的方式相同,我们可以将其称为关联的类OwnedStateActivityState,这两个字段都是我按照上一个示例中所示的方式创建为抽象类的。OwnedState有两个派生自它的类,ActivityState有三个。在数据库中我ActivityState_Id还有OwnedState_IdOwnedState_Id1

除了它们引用的类型(两个其他实体)之外,我看不出OwnedStateActivityState类之间没有任何区别,但在数据库中,似乎 EF 以某种方式对它们进行了不同的解释 - 我对 EF 内部结构的理解还不够深入知道它是如何做出这个决定的。

小智 0

如果你想让一个Owner_ID同时有CreatedState和UpdatedState来引用,那么User Owner应该放在BaseState中。

我不知道你想用这个做什么,但从逻辑上讲,你不会将 CreatedState 和 UpdatedState 作为类,而是使用 State 属性(或数据库中的列)的更多值来保存状态(Created 或 Updated) )。但是,再说一次,也许你正在尝试其他的东西......我猜。