Lui*_*cia 8 asp.net-mvc entity-framework entity-framework-4 entity-framework-4.1 asp.net-mvc-3
这个问题与此有关:
我的存储库方法有这个代码:
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) ;
}
Run Code Online (Sandbox Code Playgroud)
我的Html有这个代码:
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
</td>
<td>
@Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
</td>
Run Code Online (Sandbox Code Playgroud)
完整的例外是:
已经有一个与此命令关联的打开DataReader,必须先关闭它.
这是在第一行抛HTML @ Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
rou*_*uen 22
快速解决方案
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() ;
}
Run Code Online (Sandbox Code Playgroud)
如果你想知道,为什么要解决这个问题,请阅读LINQ和deffered执行的工作原理.简而言之 - 如果你不通过ToList"枚举"查询来"强制"执行select,那么它实际上执行得太晚了 - 在视图中.这会导致其他想要使用相同连接的查询出现问题.
hof*_*lie 12
您是否尝试过添加MultipleActiveResultSets=true;
连接字符串?
当您在另一个查询中执行新查询时,会发生此错误.考虑一下你的观点中有这样的东西
@Html.DisplayFor(modelItem => item.Device.Name)
Run Code Online (Sandbox Code Playgroud)
在您的设备型号中
public string Name
{
get
{
return String.Format("{0} {1}", Brand.BrandName, Model.ModelName);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,为了评估Device.Name,它需要查询其品牌和模型,它将成为查询内部的查询,因此解决方案是在数据库连接字符串中启用MutlipleActiveResultSets,如下所示:
<add name="MyDBContext" connectionString="Data Source=.;Initial Catalog=mydb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)