gpt4 book ai didi

c# - ObjectDisposedException 即使我正在使用 .Include()、.ToList() 和其他一切

转载 作者:太空宇宙 更新时间:2023-11-03 23:45:26 24 4
gpt4 key购买 nike

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

Controller 方法:

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 语句不环绕 View ,我试过在不同的地方声明 questionGroupWithLinks,我试过遍历 questionGroupWithLinks 并分配它的一个属性希望能加载它(没有任何区别,因为问题只在 View 中。只要你在 Controller 方法中,它就会一直加载),我已经尝试了其他东西

View (简化):

@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 访问问题组,但这没有任何区别。

如果我可以澄清任何事情或发布更多信息,请告诉我。

最佳答案

你试过吗?

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 实体,以便我们提供更多帮助。

您很可能在 QuestionGroupQuestionAnswer 上有其他一些虚拟 导航或集合属性EF 在渲染 View 时尝试加载。但是,由于您处置了上下文,因此 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 在被处置后不会再发生任何事情。

关于c# - ObjectDisposedException 即使我正在使用 .Include()、.ToList() 和其他一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27724339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com