實體框架7(核心):DataReader必須是關閉異常

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,必須先關閉它。

我怎麼能避免這個?每個數據庫請求有兩種不同的上下文,所以我無法理解為什麼會發生這種情況。

一般承認的答案

如果您有一個,兩個或更多相同的DbContext實例,數據庫服務端存在每個連接一個datareader的限制,那麼您需要在連接字符串中啟用MultipleActiveResultSets選項:

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

熱門答案

請考慮這可能是您正在使用的版本中的錯誤。

如果沒有激活MultipleActiveResultSets, 每個連接只能有一個DataReader,代碼中沒有任何地方我可以看到不止一個使用。很可能efcore沒有在ToListAsync()中正確關閉它,並且啟用MARS只是掩蓋了問題。

自您的問題發布以來,RTM已經發布,您的特定問題可能已經得到解決。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow