实体框架 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 必须先关闭。

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

实体框架 7(核心):数据读取器必须关闭异常

如果您

有一个、两个或多个同一 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已经发布,您的特定问题很可能已经解决。