实体框架的继承问题(每种类型的表)

时间:2009-03-03 07:54:00

标签: entity-framework inheritance table-per-type

对于我目前正在进行的项目的一部分,我有一组用于可联合操作的四个表。一个表是其他三个表的抽象基础,每个表在我的EF模型中表示如下:

EF Model -- Actions http://chris.charabaruk.com/system/files/images/EF+Model+Actions.png

然而,我目前面临着两个问题。第一个问题是Actor(对User的引用)和Subject(对与每种操作类型相关联的类的实体的引用)是null尽管关联的数据库列保存了关联表中行的有效键,但我的子类仍然存在。虽然我可以通过ActorReferenceSubjectReference获取密钥,但这当然需要设置新的EF上下文并查询引用的对象(如 Foo { {1}}也为空)。

第二个问题是具体行动类与其相关实体类之间关系的相互结束总是没有出现。例如,Reference.Value,它应该为我提供所有Task.RelatedActions个对象,其中TaskAction引用调用Subject的特定任务对象,完全没有对象。同样,数据库中存在有效行,实体框架不是将它们放在对象中并将它们交给我。

任何人都知道我做错了什么,以及我应该做些什么才能让它发挥作用?

更新:似乎根本没有任何关系属性在我的实体模型中起作用。 WTF ...

1 个答案:

答案 0 :(得分:5)

我认为您在此遇到的问题是,默认情况下,EF不会自动加载相关实体。如果加载实体,则除非您执行以下操作之一,否则对相关实体的集合或引用将为空:

1)使用预先加载,以便在单个查询中检索主实体和相关实体。为此,请通过添加对Include方法的调用来修改查询。在上面的示例中,您可以使用以下查询:

from a in context.Actions.Include("Actor") select a

这将使用相关的Actor方法检索每个动作。

2)使用显式延迟加载在需要时检索相关实体:

action1.ActorReference.Load()

在.Net 4.0附带的EF版本中,您还可以选择以下附加选项:

3)启用隐式延迟加载,以便在引用导航属性时自动检索相关实体。

  • 丹尼