【问题标题】:Inheritance problems with Entity Framework (table per type)实体框架的继承问题(每种类型的表)
【发布时间】:2009-03-03 07:53:59
【问题描述】:

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

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

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

第二个问题是具体动作类与其相关实体类之间关系的互惠端总是什么都没有。例如,Task.RelatedActions,它应该给我所有TaskAction 对象,其中Subject 指的是调用RelatedActions 的特定任务对象,它完全没有对象。同样,数据库中存在有效行,Entity Framework 只是没有将它们放入对象中并将它们交给我。

有人知道我做错了什么,我应该怎么做才能让它发挥作用?

更新:似乎所有关系属性都不再在我的实体模型中起作用了。卧槽……

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    action1.ActorReference.Load()
    

    在 .Net 4.0 随附的 EF 版本中,您还将拥有以下附加选项:

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

    • 丹尼

    【讨论】:

    • 我认为你是对的。不过,如果 EF 1.0 带有隐式延迟加载会很好,因为我们需要一年时间才能获得 .NET 4.0 和 EF 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多