【问题标题】:"The ObjectContext instance has been disposed" - even with a using(context) statement and ToList()“ObjectContext 实例已被释放” - 即使使用 using(context) 语句和 ToList()
【发布时间】:2012-01-19 04:33:23
【问题描述】:

我有一个使用 EF Code First 运行的 MVC3 项目。

这是我的主页/索引代码:

public ActionResult Index()
{
    var IndVM = new IndexVM();
    using (QuoteContext QDomain = new QuoteContext())
    {
        IndVM.Quotes = QDomain.Quotes.Include("Tags").Include("Author").OrderByDescending(x => x.CreatedOn).Take(5).ToList();
        IndVM.Tags = QDomain.Tags.OrderByDescending(x => x.Quotes.Count).ToList();
        IndVM.Authors = QDomain.Authors.OrderByDescending(x => x.Quotes.Count).Take(5).ToList();
    }
    return View(IndVM);
}

如您所见,我在 using 语句中有 Querying 内容,我也调用了 ToList(),但我仍然收到错误:

ObjectContext 实例已被释放,不能再用于需要连接的操作。

这是 EF Code First 中的错误吗?

【问题讨论】:

  • 告诉我们你到底在哪里得到了错误。
  • 你好,埃兰加。这是错误页面的screenshot。 :(
  • @Ciwan:上下文不应该放在那一行。也许源与服务器上的代码不同步。您可以尝试完全重建并再次尝试该屏幕截图吗?
  • 嗨梅林。我只是这样做了,我停止了服务器实例(任务栏),我对解决方案进行了 3 次清理,然后重新构建整个东西,然后运行它,并在完全相同的行上得到完全相同的错误。我可以弄乱我的实体类定义吗?底部的链接(我的另一篇文章)。

标签: asp.net-mvc-3 entity-framework c#-4.0 ef-code-first


【解决方案1】:

你必须关闭延迟加载,否则序列化器会尝试遍历导航属性并抛出这个异常。

public ActionResult Index()
{
    var IndVM = new IndexVM();
    using (QuoteContext QDomain = new QuoteContext())
    {
        QDomain.ContextOptions.LazyLoadingEnabled = false;
        // Query and populate IndVM here...
    }
    return View(IndVM);
}

【讨论】:

  • 感谢梅林的快速回复。我把那个代码放在哪里?抱歉还在学习。
  • @Ciwan:多填写一点。题外话:我建议你对局部变量使用initialCase 样式,并且只为命名空间、类、属性和方法保留大写的名称。
  • 谢谢梅林。根据我的理解,这意味着它必须在 QDomain 的定义之后,因此在 using 语句中(因为在此之前 QDomain 不存在)。所以我就去做了,虽然没有 ContextOptions,但是有这个 [ QDomain.Configuration.LazyLoadingEnabled = false; ] ...但我仍然得到完全相同的错误。 :(
  • @Ciwan:嗯,我想我记得工作了...好吧,试试看:QDomain.Configuration.ProxyCreationEnabled = false;
  • 嗨梅林。我又遇到了同样的错误。我可能在我的 Entity 类上搞砸了,这里有一个 pastebin link。我已经在谷歌上搜索了一天半,但仍然无法弄清楚。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多