C# 部分视图的延迟加载-已释放ObjectContext

C# 部分视图的延迟加载-已释放ObjectContext,c#,entity-framework,asp.net-mvc-4,razor,C#,Entity Framework,Asp.net Mvc 4,Razor,我读过很多书,其他人也喜欢,但我还是很喜欢 ObjectContext实例已被释放,不能再用于需要连接的操作 这是控制器: public ActionResult Home() { HomeViewModel model = new HomeViewModel(); return View(model); } 以下是HomeViewModel对象: public class HomeViewModel { public virtual ICollection<M

我读过很多书,其他人也喜欢,但我还是很喜欢

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

这是控制器:

public ActionResult Home()
{
    HomeViewModel model = new HomeViewModel();
    return View(model);

}
以下是HomeViewModel对象:

public class HomeViewModel
{
    public virtual ICollection<MenuItem> Menu { get; set; }

    public HomeViewModel()
    {
        using (Core db = new Core())
        {
            Menu = db.Menu.ToList();
            Dashboard = db.Dashboard.ToList<DashboardItem>();

            foreach (MenuItem item in Menu)
            {
                item.Items = (from mi in db.Menu where mi.Parent.MenuItemID == item.MenuItemID select mi).ToList();
            }
        }
    }
}
公共类HomeViewModel
{
公共虚拟ICollection菜单{get;set;}
公共HomeViewModel()
{
使用(Core db=new Core())
{
Menu=db.Menu.ToList();
Dashboard=db.Dashboard.ToList();
foreach(菜单中的菜单项)
{
item.Items=(从数据库菜单中的mi.Parent.MenuItemID==item.MenuItemID选择mi.ToList();
}
}
}
}
以下是主视图:

@model AVP.DAL.HomeViewModel

@{
    ViewBag.Title = "Home";
}

<div class="row">
    <div class="col-lg-8">@Html.Partial("SidebarP", Model)</div>

    <div class="col-lg-8">@Html.Partial("DashboardP", Model)</div>
</div>
@model AVP.DAL.HomeViewModel
@{
ViewBag.Title=“主页”;
}
@Html.Partial(“侧边栏”,模型)
@Html.Partial(“仪表板”,模型)
这是侧边栏的局部视图:

@model AVP.DAL.HomeViewModel

<div class="collapse navbar-collapse navbar-ex1-collapse">
    <ul class="nav navbar-nav nav-stacked">
        @foreach (AVP.DAL.MenuItem mi in Model.Menu.Where(m => m.Menu.Name == "SideBar")) // <-- exception thrown here
        {
            // whatever
        }
    </ul>
</div>
@model AVP.DAL.HomeViewModel

    @foreach(Model.Menu.Where中的AVP.DAL.MenuItem mi(m=>m.Menu.Name==“SideBar”)//延迟加载的工作方式是,在调用foreach之前,您不会往返到数据库。这意味着上下文已经被释放。您可能想重新考虑您的设计,看看如果您将查询投影到一个扁平模型中,您将避免这个问题。搜索“LINQ投影”www.blackwasp.co.uk对LINQ投影有很好的解释,如果有人在看的话,还有很多其他的东西。显示存储库模式的教程很棒。谢谢。您是否尝试在获取错误的行中添加.ToList()?