我有一个使用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_Id
和Owner_Id1
。但是,鉴于任何类都不是CreatedState
和UpdatedState
,似乎对两者都使用单个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
{
}
再次,没有骰子。或者,更令人担忧的,这似乎在某些情况下,而不是在别人的工作(当然我的真实结构稍微复杂一些)的时候,我可以看到它的工作类之间的精确没有什么区别。
编辑以了解失败的更多细节:
我有一个在我上面所描述的行为方式两个领域,我们可以调用相关的类OwnedState
和ActivityState
,这两个我已经在我的最后一个例子所示的方式抽象类中创建。 OwnedState
有两个派生自它的类,ActivityState
有三个。在数据库中,我有ActivityState_Id
,但OwnedState_Id
和OwnedState_Id1
。
我可以看到在所有没有区别的OwnedState
和ActivityState
从它们所引用(包括其他实体)类型的类一边,但在数据库中看来好像EF莫名其妙地解释它们不同 - 我不太了解EF内部结构,知道它是如何做出这个决定的。
答案 0 :(得分:0)
如果要让一个Owner_ID同时引用CreatedState和UpdatedState,则应将用户所有者置于BaseState中。
我不知道你要对此做些什么,但从逻辑上讲,你不会将CreatedState和UpdatedState作为类,但更多的State属性值(或数据库中的列)保存状态(已创建或已更新)。但是,再说一遍,也许你正在尝试别的东西..我想。