entity framework – 渴望加载子类相关对象

我想知道是否有可能为给定类的某些子类加载相关实体。

class级结构如下

Order与许多基本子类(SuborderBase)有关。 MySubOrder类inheritance自SuborderBase。 我想在加载Order时指定Include()加载MySubOrder相关实体(Customer)的路径,但是我得到一个错误,声称SuborderBase和Customer之间没有关系。 但是MySubOrder和Customer之间存在关系。

以下是查询失败

Context.Orders.Include("SubOrderBases").Include("SubOrderBases.Customers") 

我该如何明确指定?

更新。 实体计划如下 在此处输入图像描述

这是一个只需要一次往返的解决方案:

 var orders = Context.Orders .Select(o => new { Order = o, SubOrderBases = o.SubOrderBases.Where(s => !(s is MyOrder)), MyOrdersWithCustomers = o.SubOrderBases.OfType() .Select(m => new { MyOrder = m, Customers = m.Customers }) }) .ToList() // <- query is executed here, the rest happens in memory .Select(a => { a.Order.SubOrderBases = new List( a.SubOrderBases.Concat( a.MyOrdersWithCustomers.Select(m => { m.MyOrder.Customers = m.Customers; return m.MyOrder; }))); return a.Order; }) .ToList(); 

它基本上是对匿名类型集合的投影。 然后,查询结果将转换为内存中的实体和导航属性。 (它也适用于禁用跟踪。)

如果您不需要实体,则可以在第一个ToList()之后省略整个部分,并直接使用匿名对象中的结果。

如果你必须修改这个对象图并需要更改跟踪,我不确定这种方法是否安全,因为导入属性在加载数据时没有完全设置 – 例如,在投影之后MyOrder.Customersnull ,然后设置关系属性在内存中可以检测到它不是一个修改,并在调用SaveChanges时引起麻烦。

针对只读方案进行预测,而不是进行修改。 如果您需要更改跟踪,可能更安全的方法是在多个往返中加载完整实体,因为无法在单个往返中使用Include在您的情况下加载整个对象图。

假设您将订单列表加载为lstOrders,请尝试以下操作:

 foreach (Orders order in lstOrders) order.SubOrderBases.Load(); 

和客户一样