【问题标题】:ObjectDisposedException despite *Include* being used尽管使用了 *Include*,但 ObjectDisposedException
【发布时间】:2016-01-10 09:11:54
【问题描述】:

在我的视图模型中,我正在执行以下操作。

public List<Order> Orders { get; set; }

public ViewModel()
{
  using (Context context = new Context())
    Orders = context.Orders
      .Include(order => order.Status).ToList();
}
Order test1 = Orders.First(item => item.Status != null);
Order test2 = Orders.First(item => item.Status != null && item.Status.Id == 1);

所以我已经包含了导航属性并将它们放在那里以备将来使用。但是如果我四处张望并展开被监视的对象,我会发现状态实际上没有任何价值。它会产生以下错误。

'(test1.Status).Orders' 抛出了一个类型为 'System.ObjectDisposedException' 的异常

现在,我的理解是,如果我忘记使用 Include(),就会出现这种结果,因为实体超出了上下文的范围并被处置。但在这种情况下,它们不是,我很高兴为什么。

建议?关于我错过了什么?

在我四处寻找之后,我无法停止但有这样的印象,即包含 Status 是正确的,但它又不包含对原顺序。我对如何处理它有点困惑......

【问题讨论】:

  • 您确定数据库中的项目确实有状态吗?另外,这个代码是优先的还是数据库优先的?另外,请使用 FirstOrDefault() 而不是 First()。
  • 是的。我可以阅读它们。
  • 试一试……终于。
  • @Konrad,你能发布你的两个实体吗?对于订单和状态。
  • @KonradViltersten 抱歉,我觉得它看起来不错,除非你的模型有问题,或者全局设置覆盖了我不知道的默认值。

标签: c# entity-framework linq include


【解决方案1】:

这里的问题是你的context 默认有LazyLoadingEnabled=true,所以Include 不会为每个急切加载的Status 设置反向引用。您可以尝试关闭该上下文的延迟加载,您会看到反向引用也将被正确加载:

using (Context context = new Context()){
  context.Configuration.LazyLoadingEnabled = false;
  Orders = context.Orders
                  .Include(order => order.Status).ToList();
}

我刚刚做了一个简单的演示并确认它可以工作。

【讨论】:

  • 我想看这个演示,因为急切加载应该(并且通常会)设置这个引用。为什么不应该呢?当我在启用延迟加载的情况下急切地加载此类引用时,我可以在处理上下文后对它们做任何事情。 Anything 包括 OP 中的代码。所以恐怕你的答案不正确,还有其他事情发生在这里。
  • @GertArnold 急切加载会加载 Status,但不会加载每个状态引用的 Order。除非禁用延迟加载,否则默认情况下它似乎对您不起作用。正如我所说,我对此进行了测试,并且 OP 在接受此答案之前也进行了测试(当然)。代码很简单,你可以自己做。
  • 啊,好吧,我错过了(test1.Status).Orders 部分(Orders)。通过禁用延迟加载,您可以获得由关系修复填充的订单,而集合本身并未标记为已加载(因此,仍会触发延迟加载)。好收获!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多