【问题标题】:Linq to entities TPC and eager loading child class relationshipLinq 到实体 TPC 和急切加载子类关系
【发布时间】:2012-09-27 08:09:04
【问题描述】:

感谢您的意见

我正在使用实体框架 5.0,模型优先。

使用每个类的表(或每个具体类型的表)模式映射表。

表 A 1..许多(抽象)表 B

表 B 有 2 个子类

B1 & B2

B2 有第三个表的外键,比如说表 C(许多 B2 ... 1 C),但这不是父类 B 的属性。

急切加载是应用程序的默认设置,我想在查询表 B2 时包含表(或集合)C - 相当于(对实体的伪 linq):

from A in _db.A
.Include(A=>A.B.OfType<B2>())
.Include(A=>A.B.OfType<B2>().Include(C))
select A

感谢您对如何强制加载此表的任何想法

【问题讨论】:

    标签: linq-to-entities table-per-class


    【解决方案1】:

    问题的核心是不支持Include(A=&gt;A.B.OfType&lt;B2&gt;())

    据我了解,ADO.Net 团队似乎不想支持部分加载的子集合。 (我倾向于同意他们的观点。)在 Linq-to-sql 中有 DataLoadOptions,但没有 EF 等价物。这可以解释为什么 IncludeOfType 也不支持,因为它会告诉 EF 部分加载 Bs 的集合。

    此外,扩展方法 Include 只是 IQueryable 对象本身的 Include 方法(如果存在)的包装。 以ObjectQuery.Include 为例:一个非常简单的方法,仅使用一个字符串作为参数(DbQuery.Include 相同),其中包含要包含的导航属性的路径(_db.A.Include("B"))。换句话说:您只能使用可以解析为 MemberExpression 的字符串。而B.OfType&lt;&gt;() 是一个方法。

    解释为什么不能包含 C 的长篇大论:通往 C 的路径无效。

    可以

    _db.B.OfType<B2>().Include(b => b.A).Include(b => b.C)
    

    但这可能不会给你你想要的结果。

    【讨论】:

    • 谢谢您 - 一个深思熟虑的答案,一个明确的拒绝可以节省数小时尝试解决问题的时间。 TPC 继承用于重用关联部分类中的许多共性,但无法使用 include OfType 让我认为我应该实现接口和扩展方法。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2011-04-09
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多