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

C# 实体框架代码第一个TPH继承-不同的子类可以共享一个字段吗?,c#,entity-framework,ef-code-first,table-per-hierarchy,C#,Entity Framework,Ef 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 { ge

我首先使用实体框架代码创建了一个实体框架模型,该模型使用每个层次结构的表继承,其中结构看起来有点像这样:

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\u Id
Owner\u Id 1
。但是考虑到没有一个类会同时是
CreatedState
updateState
,似乎对这两个类都使用一个
Owner\u Id
是合乎逻辑的。这也会使跟踪数据库变得更容易

我的基本问题是:对于代码优先的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\u Id
,但也有
OwnedState\u Id
OwnedState\u Id 1


我看不出
OwnedState
ActivityState
类之间有什么区别,除了它们引用的类型(两个其他实体)然而在数据库中,似乎EF以某种方式对它们进行了不同的解释——我不太了解EF的内部结构,不知道它是如何做出决定的。

如果您想让一个所有者ID同时引用CreatedState和UpdateState,那么应该将用户所有者置于BaseState


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

我想您不能使用静态字段,因为并非所有子类都共享相同的值?@JohnWillemse正确。我不知道实体框架代码第一个POCO(我什么时候成为那种必须键入这样的短语的程序员)在静态字段方面发挥了多大的作用。像你那样放入基类实际上应该是有效的-你需要更具体地说明哪些不起作用,如果它不起作用。还有你的[列(“OwnerId”)]没有任何效果-如果您想这样做,请将
public int-OwnerId{get;set;}
fk放在导航旁边。但这与你的情况无关。@NSGaga更新了这个问题-基本上,我以看似相同的方式使用了相同的技术两次,但只在一种情况下有效。如果它们不是类,状态是什么?它只是一个任意字符串吗?正如您在问题的最后一个代码块中看到的,我尝试在父类上使用该属性,而实体框架仍然在使用它做同样奇怪的事情。问题是为什么EF很奇怪,并创建了额外的字段,而不是我为这个问题创建的简化设计的意图是否实用,而事实并非如此。@glenatron为状态创建单独的类仍然不会为您提供要存储的状态。我对上述问题的建议是为状态创建enum,例如enum state{Created,Updated},然后将其作为属性存储在类中。这还允许您存储一个已创建和更新的状态值,以处理两个状态都可以存储的情况。(因为同时创建和更新状态是没有意义的。)@glenatron请理解,我只是想确定OwnerId在state类而不是BaseState类中的用途,以便我能提供帮助。在版本5之前,无法将枚举与实体框架一起使用,这对于这个问题所涉及的项目来说是不可用的——这是几年前的事了。此外,每个州都有一组与之相关的其他信息,其中许多信息是相同的,但根据所处的州的不同,有些信息是不同的。如果不处理奇怪的ORM行为,这是使用继承的相当标准的场景。虽然EF不支持枚举,但它可以转换为字符串或Int,从而允许EF用作列。但我认为这是离题的,因为您想要使用继承。