我使用的是EF7(EF Core)。 当我试图用单一方法更新这样的DB项目时......
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 :(得分:8)
如果您有一个,两个或更多相同DbContext的实例,数据库服务端存在每个连接一个datareader的限制,则无关紧要,因此您需要在连接字符串中启用MultipleActiveResultSets选项:
<add name="XYZ" connectionString="Server=SERVER;Database=DATABASE;
Trusted_Connection=SSPI;MultipleActiveResultSets=True;"
providerName="System.Data.SqlClient"/>
答案 1 :(得分:1)
请注意,这可能是您正在使用的版本中的错误。
如果没有激活MultipleActiveResultSets,每个连接只能有一个DataReader ,代码中没有任何地方我可以看到使用多个。很可能efcore没有在ToListAsync()中正确关闭它,并且启用MARS只是掩盖了问题。
自您的问题发布以来,RTM已经发布,您的特定问题可能已经得到解决。