5

我有一个使用 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存储的表中。但是鉴于没有一个类会同时是 aCreatedState和 anUpdatedState似乎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; }
}

那似乎没有任何效果。

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

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 内部结构知道它是如何做出这个决定的。

4

1 回答 1

0

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

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

于 2015-01-14T07:38:04.663 回答