2016-03-03 62 views
3

我正在使用EF7(EF核心)。 当我试图更新数据库的项目,如这一个方法...实体框架7(核心):DataReader必须关闭异常

using (var db = new DBContext()) 
{ 
    var deadSources = 
     await 
      db.Source.Where(x => !x.Item.Any()) 
       .ToListAsync(); 
    foreach (var srs in deadSources) 
    { 
     srs.InspectionFailed = true; 
     srs.InspectionFailedDescription = "ERROR"; 
    } 
    await db.SaveChangesAsync(); 
} 

using (var db = new DBContext()) 
{ 
    var aliveSources = 
     await 
      db.Source.Where(x => x.Item.Any()) 
       .ToListAsync(); 
    foreach (var srs in aliveSources) 
    { 
     srs.InspectionFailed = false; 
     srs.InspectionFailedDescription = string.Empty; 
    } 
    await db.SaveChangesAsync(); // Exception here 
} 

...这将引发异常:

已经有与此命令相关的开放其中的DataReader必须先关闭 。

我该如何避免这种情况?每个数据库请求有两种不同的上下文,所以我不明白为什么会发生这种情况。

+0

此代码是单个使用语句,引发异常。这就是为什么我分开它。但没有运气。 – AsValeO

回答

6

它不一样,如果你有相同的DbContext的一个,两个或更多的情况下,每个连接一个DataReader的的限制存在于数据库服务端,所以您需要启用MultipleActiveResultSets选项在连接字符串中的事项:

<add name="XYZ" connectionString="Server=SERVER;Database=DATABASE; 
Trusted_Connection=SSPI;MultipleActiveResultSets=True;" 
providerName="System.Data.SqlClient"/> 
+0

你确定吗?我一直认为这是一个_connection_。看起来efcore并未关闭阅读器或释放与池的连接。 –

+0

@JorgeAlves,即使您直接使用ADO.NET,您也会得到相同的行为,如果您希望为同一连接使用多个数据读取器,则需要启用MultipleActiveResultSets。 –

+0

对于需要MARS的示例,请检查[此链接](https://msdn.microsoft.com/en-us/library/yf1a7f4f(v = vs.110).aspx)。查看可重入的DataReaders?这基本上是MARS允许你做的。 如果efcore在SaveChangesAsync中这样做,你可以打赌有一个地方的错误。 –

1

请考虑这可能是您使用的版本中的错误。

如果没有积极MultipleActiveResultSets你只能有每个连接一个DataReader的无处在代码中,我可以看到正在使用不止一个。很可能efcore没有在ToListAsync()中正确关闭它,并且启用MARS只是掩盖了这个问题。

RTM自您的问题发布以来已经发布,您的特定问题可能已经很好地解决了。