7

这个问题是关系到this实体框架:已经有与此命令相关联的打开的DataReader,必须先关闭

我的仓库方法有以下代码:

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有这代码:

@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,它必须先关闭。

正是在的HTML @ Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)

回答

20

快速的解决方案:

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,那么它实际上执行得太晚 - 在视图中。这对其他想要使用相同连接的查询造成麻烦。

+0

当我重新实现了两个相似的模型类以从使用TPH继承结构的模型基类继承时发生这种相同的错误,其中一个派生类存在一对一或一对一的关系,并且我正在使用该模型的控制器中的急切加载。据我所知,在这种情况下不支持急切的加载,因此在控制器中放弃此属性的'.Include(...)',并将'.ToList()'添加到剩下的''的末尾。包括(...)'语句似乎解决了问题 - 谢谢。 –

1

第一行掷一般不考虑使用EF对象,但创建一个对象POCO视图模型并将查询结果映射到视图模型上。 EF不会在存储库方法中执行查询,因为查询不是在定义时间执行的,而只是在您尝试访问数据时执行的。在您看来,您多次使用相同的查询,这是不正确的。

如果你想访问你的资源库方法返回的对象的列表,使用toList

0

真正的问题,如果你是懒惰加载从ApplicantPosition实体的位置引用查询结束此执行之前。如果你想保持这种情况下延期执行,你可以像这样在你的查询中加载Position参考:

Include(o => o.applicantPosition.Select(a => a.Position));

并在您的GetApplicationPositionHistories不断返回IEnumerable。

另一种解决方案是在查询上调用ToList()或ToArrray()方法的GetApplicationPositionHistories方法上实际运行查询。

6

当您在另一个查询中执行新查询时,会发生此错误。考虑你有这样的事情在你看来

@Html.DisplayFor(modelItem => item.Device.Name) 

,并在您设备的型号,那么

public string Name 
    { 
     get 
     { 
      return String.Format("{0} {1}", Brand.BrandName, Model.ModelName); 
     } 
    } 

则由于评估设备。将它命名为需要查询其品牌和型号将成为查询中查询,因此该解决方案是使MutlipleActiveResultSets您的数据库连接字符串中,如下所示:

<add name="MyDBContext" connectionString="Data Source=.;Initial Catalog=mydb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
12

你有没有尝试添加MultipleActiveResultSets=true;到连接字符串?

+2

我正在使用上下文。 。查找(id),由于某种原因导致OP提到的错误。将此设置添加到连接字符串解决了问题。 – CodeMonkey

相关问题