我的项目是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
,但这没有任何区别。
如果我能澄清任何内容或发布更多信息,请告诉我。
答案 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试图加载的Answer
,virtual
或QuestionGroup
上有一些其他Question
导航或集合属性。但是,由于您处理了上下文,因此EF无法延迟加载它,并抛出异常。
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
被处置后不再发生任何事情。