如何通过引用持久基类型的实例(实体框架4)来深度加载实体

时间:2011-08-26 10:23:57

标签: entity-framework-4

Domain Model

以上是我们的域模型的简化版本。 NotificationOrder引用了一个子类的实例(从逻辑上考虑ReferenceNumberBase)。

问题:

我希望查询返回满足XYZ的所有NotificationOrders,我希望该查询热切地加载CustomerCase的所有引用实例(包括该图的所有相关对象,Group除外暂时忘掉那个问题。)

我已经尝试过寻找解决方案,但我找到的只是解决问题的解决方案,相当于直接查询CustomerCase作为根对象。

我想要这样的事情:

    var query = ObjectContext.CreateObjectSet<NotificationOrder>.Where(e => e.NotificationType == "Foo");
    return ((ObjectSet<NotificationOrder>) query).Include("ReferenceNumberBase");

但是,这不会加载Vehicle CustomerCase实例或任何其他相关对象。我如何表达这一点,以便EF理解我想要的急切负载(我非常希望避免多次往返/通知顺序)?

注意:由于CustomerCase是派生类型,我无法做正常的传递,包括使用以下内容:

    var query = ObjectContext.CreateObjectSet<NotificationOrder>.Where(e => e.NotificationType == "Foo");
    return ((ObjectSet<NotificationOrder>) query).Include("ReferenceNumberBase.Vehicle"); // 

因为Vehicle属性是派生CustomerCase类型的成员,而不是ReferenceNumberBas类型的成员,而是我们得到如下错误:

“EntityType'Mode.ReferenceNumberBase'不会声明名为'Vehicle'的导航属性。”

我也不能使用query.OfType<CustomerCase>...,因为查询类型是NotificationOrder,而不是ReferenceNumberBase(或者我可以以某种方式?)。

PS。我们正在使用EF4自我跟踪POCO实体(尚未升级到4.1)

编辑:我已经搜索了一些,并且大约一年前,这看起来是Include()方法的限制(至少在那个时候)。这是否准确,从那时起就被贴上了? [来源]

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/a30351ab-5024-49a5-9eb4-798043a2b75d

http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1057763-inheritance-eager-loading?ref=title

https://connect.microsoft.com/VisualStudio/feedback/details/594289/in-entity-framework-there-should-be-a-way-to-eager-load-include-navigation-properties-of-a-derived-class

0 个答案:

没有答案