实体框架代码第一个TPH继承 - 不同的子类可以共享一个字段吗?

时间:2013-04-19 11:25:16

标签: c# entity-framework ef-code-first table-per-hierarchy

我有一个使用Entity Framework Code First创建的实体框架模型,它使用Table Per Hierarchy继承,其结构看起来有点像这样:

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; }
}

现在,我创建的BaseStates表中存储了Owner_IdOwner_Id1。但是,鉴于任何类都不是CreatedStateUpdatedState,似乎对两者都使用单个Owner_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; }
}

这似乎没有效果。

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

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


public class CreatedState : OwnedState
{

}

public class UpdatedState : OwnedState
{

}

再次,没有骰子。或者,更令人担忧的,这似乎在某些情况下,而不是在别人的工作(当然我的真实结构稍微复杂一些)的时候,我可以看到它的工作类之间的精确没有什么区别。

编辑以了解失败的更多细节: 我有一个在我上面所描述的行为方式两个领域,我们可以调用相关的类OwnedStateActivityState,这两个我已经在我的最后一个例子所示的方式抽象类中创建。 OwnedState有两个派生自它的类,ActivityState有三个。在数据库中,我有ActivityState_Id,但OwnedState_IdOwnedState_Id1

我可以看到在所有没有区别的OwnedStateActivityState从它们所引用(包括其他实体)类型的类一边,但在数据库中看来好像EF莫名其妙地解释它们不同 - 我不太了解EF内部结构,知道它是如何做出这个决定的。

1 个答案:

答案 0 :(得分:0)

如果要让一个Owner_ID同时引用CreatedState和UpdatedState,则应将用户所有者置于BaseState中。

我不知道你要对此做些什么,但从逻辑上讲,你不会将CreatedState和UpdatedState作为类,但更多的State属性值(或数据库中的列)保存状态(已创建或已更新)。但是,再说一遍,也许你正在尝试别的东西..我想。

相关问题