实体框架:已经有一个与此命令关联的开放DataReader必须先关闭 [英] Entity Framework: There is already an open DataReader associated with this Command which must be closed first
问题描述
此问题与这个:
我的存储库方法有以下代码:
My repository method has this code:
public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId)
{
return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition) ;
}
我的Html有以下代码:
My Html has this code:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
</td>
完整的例外是:
已经是一个与此命令关联的开放DataReader,必须首先关闭。
There is already an open DataReader associated with this Command which must be closed first.
它被放在HTML
@ Html.DisplayFor(modelItem)的第一行=> item.applicantPosition.Applicant.name)
It was throw in the first line of the HTML @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
推荐答案
快速解决方案:
public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId)
{
return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition).ToList() ;
}
如果你想知道,为什么这样解决你的问题,看看LINQ和降级执行的工作。几句话 - 如果你不通过ToList枚举查询来强制执行select,实际上执行得太晚了 - 在视图中。而这会导致其他希望使用相同连接的查询的麻烦。
If you want to know, why this fixing your problem, read about how LINQ and deffered execution works. In few words - if you dont "force" execution of the select by "enumerating" query by ToList, it is in fact executed too late - in view. And this is causing trouble with other queries which want to use same connection.
这篇关于实体框架:已经有一个与此命令关联的开放DataReader必须先关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!