如何将EF子实体附加到EF实体?

时间:2013-08-08 17:36:49

标签: entity-framework entity-framework-5

假设我有一个Order实体和一个OrderItem实体,并且我正在尝试一次获取多个订单的详细信息(包括项目)。

我可以使用.Include来获取Order和OrderItem的详细信息,如下所示:

var orders = db.Orders
               .Include(o => o.OrderItem)
               .Where(o => orderIds.Contains(o.Id));

但是,假设我无法使用.Include因为it doesn't work

相反,我可以获取所有订单,然后获取所有OrderItems,如下所示:

var orders = db.Orders.Where(o => orderIds.Contains(o.Id));

var orderItems = db.OrderItems.Where(i => orderIds.Contains(i.OrderId));

这将给我所有订单和(单独)所有相关的OrderItems。但是,如何将OrderItem对象“附加”到相关的Order对象,以便导航属性正常工作?

(换句话说,我如何确保order.OrderItemsorderItem.Order工作而不会导致EF从数据库中获取数据而不是使用我已经检索过的数据。

2 个答案:

答案 0 :(得分:0)

关于您的上一个问题 - how do I ensure that order.OrderItems and orderItem.Order work without causing EF to go fetch the data from the database ... - 您可以先将.Load()个问题留在记忆中:

orders.Load();
orderItems.Load();

然后通过您的上下文的Local属性使用它们:

var qo = db.Orders.Local.Where(...);
var qoi = db.OrderItems.Local.Where(...);

答案 1 :(得分:0)

只是结束这个问题,这就是我所做的/学到的:

1)正如Slauma在他的评论中指出的那样,即使单独提取OrdersOrderItems,EF确实会修复导航属性,因此例如每个OrderItem的Order属性都正确指向到正确的Order

2)不幸的是,EF无法知道订单的OrderItems所有已被提取,因此如果Order.OrderItems导航属性是懒惰的 - 加载,然后访问该属性将导致EF重新获取数据库中的所有OrderItem数据 - 它将按Order执行此操作。显然不好。

3)避免上述问题的唯一方法似乎是删除该集合属性上的延迟加载(以及其他类似集合 - 一对一导航属性不受此问题的影响)。