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)
再说一次,没有骰子。或者,更令人担忧的是,当我可以看到它确实工作的类之间没有任何区别时,这似乎在某些情况下起作用,而在其他情况下不起作用(显然我的真实配置稍微复杂一些)。
编辑有关失败原因的更多详细信息:我有两个字段的行为方式与上面描述的方式相同,我们可以将其称为关联的类OwnedState和ActivityState,这两个字段都是我按照上一个示例中所示的方式创建为抽象类的。OwnedState有两个派生自它的类,ActivityState有三个。在数据库中我ActivityState_Id还有OwnedState_Id和OwnedState_Id1。
除了它们引用的类型(两个其他实体)之外,我看不出OwnedState和ActivityState类之间没有任何区别,但在数据库中,似乎 EF 以某种方式对它们进行了不同的解释 - 我对 EF 内部结构的理解还不够深入知道它是如何做出这个决定的。
小智 0
如果你想让一个Owner_ID同时有CreatedState和UpdatedState来引用,那么User Owner应该放在BaseState中。
我不知道你想用这个做什么,但从逻辑上讲,你不会将 CreatedState 和 UpdatedState 作为类,而是使用 State 属性(或数据库中的列)的更多值来保存状态(Created 或 Updated) )。但是,再说一次,也许你正在尝试其他的东西......我猜。