Asp.net mvc 3 &引用;在Dispose”之后访问DataContext;从控制器ASP.NET MVC 3中的ActionResult方法处理datacontext时出错

Asp.net mvc 3 &引用;在Dispose”之后访问DataContext;从控制器ASP.NET MVC 3中的ActionResult方法处理datacontext时出错,asp.net-mvc-3,datacontext,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); //cont

这是我的密码:

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());
  }
}
public ActionResult主菜单(int-id)
{
使用(WebDataContext=newwebdatacontext())
{
//var dataLoadOptions=new System.Data.Linq.dataLoadOptions();
//dataLoadOptions.LoadWith(x=>x.Menu);
//context.LoadOptions=dataLoadOptions;
var menu=context.MenuCaches
.可计算的()
.其中(x=>x.ID==ID
&&(x.Local==true | | x.National==true));
foreach(菜单中的变量项)
{
if(item.Parent.Parent!=null&&item.Parent.ParentID==0)
{
菜单=项。子项;
}
}
返回视图(menu.ToList());
}
}

我在网上找到了一些解决方法。一种是做
yield-returnview(菜单))
但这给了我一个错误,
ActionResult不是迭代器。函数中的注释代码是我发现的另一个选项,但也不起作用。有什么想法吗?非常感谢。

以下是我要做的,我将在
控制器
级别查看
WebDataContext
覆盖Dispose()
并在那里调用context.Dispose()。

我不能确定,但可能与
返回视图(menu.ToList())
有关,因为我相信实际结果(视图)直到稍后在MVC管道中才会执行,因此在处置
WebDataContext
之后才会执行
ToList()
。我打赌这将解决问题:

public ActionResult MainMenu(int id)
{
  IENumerable<MenuCache> menu;

  using (WebDataContext context = new WebDataContext())
  {
    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;
      }
    }
    menu = menu.ToList();
  }
  return View(menu);
}
public ActionResult主菜单(int-id)
{
可数菜单;
使用(WebDataContext=newwebdatacontext())
{
menu=context.MenuCaches
.可计算的()
.其中(x=>x.ID==ID
&&(x.Local==true | | x.National==true));
foreach(菜单中的变量项)
{
if(item.Parent.Parent!=null&&item.Parent.ParentID==0)
{
菜单=项。子项;
}
}
menu=menu.ToList();
}
返回视图(菜单);
}

我很好奇您是否正在创建一个可枚举列表,以便稍后运行查询。 不知道你的父母引用是什么,这很难说。但我99.9%确定这就是问题所在,你的ToList正在创建一个可以进一步查询的项目列表(并且在你的视图中)


ViewModel肯定能解决这个问题,但要确保视图不会访问列表中每个项的根级别尚未加载的任何属性(并且不会调用列表项中的任何子项)

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

Wow,因此这很可能是两件事中的一件;首先,您可能正试图从men访问另一个表中存在的关系对象u并且您没有
LoadWith()
该对象,或者它是另一个
WebDataContext
对象。错误实际上不应该发生在控制器中,而应该发生在视图中。实际的错误堆栈跟踪和代码位置是什么(使用此信息更新您的问题)?我相信您的问题在于,在您的视图中,您正在访问“MenuCache”的属性,该属性是一个实体,在处理数据上下文之前未加载。请检查视图中正在访问的任何属于“MenuCache”属性的实体,并使用DataLoadOptions加载它们。