实体框架 7(核心):数据读取器必须关闭异常
本文关键字:异常 读取 数据 框架 核心 实体 | 更新日期: 2023-09-27 18:37:09
我正在使用EF7(EF Core)。当我尝试以单一方法更新这样的数据库项目时......
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 必须先关闭。
我怎样才能避免这种情况?每个数据库请求有两个不同的上下文,所以我不明白为什么会发生这种情况。
如果您
有一个、两个或多个同一 DbContext 的实例并不重要,数据库服务端存在每个连接一个数据读取器的限制,因此您需要在连接字符串中启用 MultipleActiveResultSets 选项:
<add name="XYZ" connectionString="Server=SERVER;Database=DATABASE;
Trusted_Connection=SSPI;MultipleActiveResultSets=True;"
providerName="System.Data.SqlClient"/>
考虑到这可能是您正在使用的版本中的一个错误。
如果没有激活的MultipleActiveResultSets,每个连接只能有一个DataReader,并且在代码中我看不到使用多个DataReader。efcore 很可能没有在 ToListAsync() 中正确关闭它,启用 MARS 只是掩盖了问题。
自从您的问题发布以来,RTM已经发布,您的特定问题很可能已经解决。