实体框架7(核心):DataReader必须是关闭异常

时间:2016-03-03 13:54:09

标签: c# entity-framework-core

我使用的是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   必须先关闭。

我该如何避免这种情况?每个数据库请求有两种不同的上下文,所以我无法理解这种情况发生的原因。

2 个答案:

答案 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已经发布,您的特定问题可能已经得到解决。