从控制器ASP.NET MVC 3中的ActionResult方法处理datacontext时出现“Dispose后访问的DataContext”错误

时间:2011-12-23 18:36:10

标签: asp.net-mvc-3 datacontext

这是我的代码:

public ActionResult MainMenu(int id)
{
  using (WebDataContext context = new WebDataContext())
  {
    //var dataLoadOptions = new System.Data.Linq.DataLoadOptions();
    //dataLoadOptions.LoadWith<MenuCache>(x => x.Menu);
    //context.LoadOptions = dataLoadOptions;

    var menu = context.MenuCaches
                      .AsEnumerable()
                      .Where(x => x.ID == id 
                                  && (x.Local == true || x.National == true));
    foreach (var item in menu)
    {
      if (item.Parent.Parent != null && item.Parent.ParentID == 0)
      {
        menu = item.Children;
      }
    }
    return View(menu.ToList());
  }
}

我在网上找到了一些如何修复它的选项。一个是做yield return View(menu));,但这给了我ActionResult is not an iterator的错误。函数中的注释代码是我找到的另一个选项,但这也没有用。有任何想法吗?非常感谢。

4 个答案:

答案 0 :(得分:0)

以下是我要做的事情,我会将WebDataContext放在Controller级别override Dispose()范围内,并在其中调用context.Dispose()。

答案 1 :(得分:0)

我无法确定,但它可能与return View(menu.ToList())有关,因为我相信实际结果(视图)直到MVC管道的后期才执行,所以{{1在你的ToList()被处置之后才会被执行。我打赌这会解决问题:

WebDataContext

答案 2 :(得分:0)

我很好奇你是否正在创建一个枚举列表,然后可以运行查询。 不知道你的'父母参考是什么,很难说。但我99.9%肯定这里的问题,你的ToList正在创建一个可以进一步查询的项目列表(并在你的视图中)

ViewModel肯定会摆脱这个问题,但要确保您的视图不会访问列表中每个项目的根级别尚未加载的任何属性(并且不会调用列表项中的任何子项目)< / p>

答案 3 :(得分:0)

将菜单传递到视图实际上是一个浅拷贝(指针拷贝)。这将使连接保持活跃状态​​。您需要执行菜单对象的深层复制。我敢打赌,如果你直接在数据上下文中调用dispose,那么视图就会有一个null对象。