ObjectDisposedException,即使我正在使用.Include(),. ToList()和其他所有内容

时间:2014-12-31 17:29:47

标签: c# entity-framework asp.net-mvc-5 objectdisposedexception

我的项目是C#.NET,MVC 5,EF6。我正在使用从数据库中获取的视图中的对象获得ObjectDisposedException。我读过很多类似的问题,但.Include()不起作用;我认为这个问题与延迟加载没有任何关系。

控制器方法:

public ActionResult Browse()
{
    List<QuestionGroup> questionGroupsWithLinks = new List<QuestionGroup>();
    using (CLASSContext context = new CLASSContext())
    {
        questionGroupsWithLinks = context.QuestionGroup.Include(qg => qg.Questions.Select(q => q.Answers))
            .Where(qg => qg.QuestionGroupID == 128).ToList();
        return View("Browse", questionGroupsWithLinks);
    }
}

我试过让using语句没有环绕视图,我尝试在不同的地方声明questionGroupWithLinks,我尝试迭代questionGroupWithLinks并希望分配其中一个属性会加载它(没有任何区别,因为问题只出现在视图中。只要你在控制器方法中它就会被加载),我也尝试了其他的东西。

观点(简化):

@model List<CLASSOnlineAssessments.Models.Assessments.QuestionGroup>
<div class="page-copy">
    @if (Model != null)
    {
        foreach (QuestionGroup qg in Model)
        {
            //More code here; but it always fails before this point.
        }
    }
</div>

我尝试使用Model.First()来访问问题组而不是foreach,但这没有任何区别。

如果我能澄清任何内容或发布更多信息,请告诉我。

1 个答案:

答案 0 :(得分:3)

你试过这个吗?

public ActionResult Browse()
{
    CLASSContext context = new CLASSContext();
    List<QuestionGroup> questionGroupsWithLinks = context.QuestionGroup
        .Include(qg => qg.Questions.Select(q => q.Answers))
        .Where(qg => qg.QuestionGroupID == 128).ToList();
    return View("Browse", questionGroupsWithLinks);
}

如果这不会导致错误,那么它确实有点像延迟加载的问题,你应该发布QuestionGroup实体的来源以及Question和{{1}实体,以便我们可以提供更多帮助。

在渲染视图时,EF试图加载的AnswervirtualQuestionGroup上有一些其他Question导航或集合属性。但是,由于您处理了上下文,因此EF无法延迟加载它,并抛出异常。

BTW,请勿在生产中使用上述内容。你应该总是在请求结束时处理Answer。实际上,你应该做更多这样的事情:

DbContext

通过上述操作,您可以将附加到上下文的实体中的所有数据完全传输到ViewModel数据传输对象。如果public ActionResult Browse() { using (CLASSContext context = new CLASSContext()) { List<QuestionGroupViewModel> questionGroupsWithLinks = context.QuestionGroup .Include(qg => qg.Questions.Select(q => q.Answers)) .Where(qg => qg.QuestionGroupID == 128) .Select(x => new QuestionGroupViewModel { Id = x.Id, // ...etc. }) .ToList(); return View("Browse", questionGroupsWithLinks); } } 错误确实来自EF,那么上述内容将确保在ObjectDisposedException被处置后不再发生任何事情。