实体框架:已经有一个与此命令关联的开放DataReader,必须先关闭它

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;连接字符串?

  • 我正在使用context.<DbSet> .Find(id),由于某种原因导致OP提到的错误.将此设置添加到连接字符串可解决此问题. (2认同)

Moh*_*hin 6

当您在另一个查询中执行新查询时,会发生此错误.考虑一下你的观点中有这样的东西

@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)