1

我的项目是 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,但这没有任何区别。

让我知道我是否可以澄清任何事情或发布更多信息。

4

1 回答 1

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实体的源代码以及QuestionAnswer实体,以便我们可以提供更多帮助。

很可能您在 、 或 EF 上具有其他virtual导航或集合属性QuestionGroupQuestion或者AnswerEF 在呈现您的视图时尝试加载。但是,由于您处理了上下文,EF 不能延迟加载它,并引发异常。

顺便说一句,不要在生产中使用上述内容。你应该总是DbContext在请求结束时以某种方式处理掉。实际上,您应该做更多这样的事情:

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);
    }
}

通过以上操作,您将所有数据从附加到上下文的实体中完全传输到 ViewModel 数据传输对象。如果ObjectDisposedException错误确实来自 EF,那么上述内容将确保DbContext在处理它之后不会发生任何进一步的事情。

于 2014-12-31T17:38:38.773 回答