【发布时间】:2013-08-08 17:36:49
【问题描述】:
假设我有一个 Order 实体和一个 OrderItem 实体,并且我试图一次获取多个订单的详细信息(包括商品)。
我可以像这样使用.Include 将订单和订单项详细信息一起获取:
var orders = db.Orders
.Include(o => o.OrderItem)
.Where(o => orderIds.Contains(o.Id));
但是,假设我不能使用.Include,因为it doesn't work。
相反,我可以获取所有订单,然后获取所有订单项,如下所示:
var orders = db.Orders.Where(o => orderIds.Contains(o.Id));
var orderItems = db.OrderItems.Where(i => orderIds.Contains(i.OrderId));
这将为我提供所有订单和(单独)所有相关的订单项。但是如何将OrderItem 对象“附加”到相关的Order 对象,以便导航属性正常工作?
(换句话说,我如何确保order.OrderItems 和orderItem.Order 在不导致EF 从数据库中获取数据而不是使用我已经检索到的数据的情况下工作)。
【问题讨论】:
-
您是否尝试过切换 EF 的代理生成(包括延迟加载)并在代码中设置导航探针?
-
只要关系不是多对多并且没有禁用更改跟踪,它应该会自动将所有加载的
OrderItems 添加到正确的Order的导航集合中s(称为“关系修正”)。你测试了吗?不行吗? -
@Slauma:谢谢,它看起来正在工作。让我感到困惑的是,检查调试器中的实体会导致由于某种原因重新获取数据。如果我避免使用调试器,而是访问代码中的各种成员,那么它似乎不会回到数据库。您能否将您的评论转换为答案,以便我接受并关闭问题?
-
@Slauma: ...但是等等-根据msdn.microsoft.com/en-US/data/jj691402“如果你启用了延迟加载,访问博客实体之一上的posts属性,那么EF将连接到数据库以延迟加载所有帖子,即使我们已经加载了所有帖子。这是因为 EF 无法知道您是否已加载所有帖子或数据库中是否还有更多帖子。如果您想避免这种情况,则需要禁用延迟加载“ .所以大概我在这里会遇到同样的问题。 (我的实际场景并不像我描述的那么简单,所以我很难测试)。
-
对于 EF5,我现在正在做的是禁用 EF 的延迟加载,并在我自己的项目中完全在需要的地方处理延迟加载。 IIRC,EF6 将提供将导航集合属性标记为已加载的选项。您是否可以选择升级到 EF 的预发布版本?
标签: entity-framework entity-framework-5