gpt4 book ai didi

c# - Entity Framework 5 预加载父属性

转载 作者:行者123 更新时间:2023-11-30 17:51:48 24 4
gpt4 key购买 nike

我查询了某个父实体 ( Order ),我想急切地加载它的一些子集合或属性。我有这样的查询:

public void QueryMethod()
{
using (var context = new MyContext())
{
var orders = context.Order.Include("OrderProduct")
.Include("OrderProduct.ProductVariant")
.Where(some query)
.ToList();
}
}

我正在做的是遍历这个订单集合并为每个 Order我到达 OrderProductProductVariant特性。当上下文处于事件状态时,我可以在查询方法中执行此操作。但是当我尝试访问 ProductVariant.OrderProduct 时在上下文之外,我得到 ObjectDisposedException .

顺便说一下,我正在尝试访问 ProductVariant.OrderProduct出于某种奇怪的原因。我想我不应该这样访问它,但我的意思是我可以从 OrderProduct 到达至 ProductVariant , 但我无法从 ProductVariant 访问至 OrderProduct .我想知道为什么尽管我添加了 OrderProduct.ProductVariant 还是会出现此错误进入我急切的加载属性。它不是应该双向工作吗?

非常感谢任何帮助。

最佳答案

您在上下文之外获得 ObjectDisposedException 的事实表明 Entity Framework 试图通过从数据库延迟加载来加载 ProductVariant.OrderProduct 引用的对象。

现在,这并不一定意味着 - 这句话听起来很奇怪 - ProductVariant.OrderProduct 尚未加载并填充正确的实体。可能是这样,因为它只是 OrderProduct.ProductVariant 的反向属性,您 通过预先加载加载了它。对于一对一和一对多关系,EF 将在加载导航属性时自动填充反向导航属性(“关系修正”)。

尽管填充了反向导航属性,但它不一定标记为已加载,这是由每个导航属性的上下文维护的标志,它告诉 EF 是否必须从数据库加载导航属性当您在代码中访问它时通过延迟加载。

例如,对于一对多关系,很容易看出 EF 不能将导航属性标记为已加载,因为它由于关系修复而被填充。例如:如果您加载一个包含其客户引用的订单 - context.Orders.Include("Customer").Single... - 急切加载的 Orders 集合客户将包含此加载的订单(由于关系修复)。但是这个订单很可能不是该客户拥有的唯一订单(或者至少 EF 不知道这是唯一的订单还是数据库中是否有更多订单)。如果您访问 Customer.Orders 集合,您通常期望不仅返回这个单个订单而且返回客户的所有订单 - 换句话说,您期望发生延迟加载查询来加载其余订单来自数据库的客户订单。

现在,对于一对一的关系,这个论点并不能真正令人信服,因为对于这样的关系,很明显数据库中不能有超过一个相关对象。那么,如果已经加载了这个相关对象,为什么 EF 要运行延迟加载查询?

我不知道为什么 EF 仍然尝试为一对一关系加载反向导航属性,但可能它只是不区分一对多和一对一关系在这方面。也许 EF 遵循一般规则,如果关系的主要方面由关系修复填充,则它不会标记为已加载,并且在任何情况下访问它时都会发生延迟加载。 (如果 OrderProductProductVariant 是主体,我真的无法从您的代码片段中看出,这只是一个猜测。)

无论如何,在您的情况下,我会禁用延迟加载甚至代理创建(包括禁用延迟加载),因为您在 using block 中使用 Include 并且延迟加载在这里没有任何好处。您遇到的异常应该会消失:

using (var context = new MyContext())
{
context.Configuration.ProxyCreationEnabled = false;

var orders = context.Order.Include("OrderProduct")
.Include("OrderProduct.ProductVariant")
.Where(some query)
.ToList();
}

关于c# - Entity Framework 5 预加载父属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19053173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com