Entity Framework 7(コア):DataReaderを閉じる必要があります

c# entity-framework-core

質問

私はEF7(EFコア)を使用しています。私はこのような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が既にあります。このDataReaderは最初に閉じる必要があります。

どうすればこれを避けることができますか?それぞれのDBリクエストには2つの異なるコンテキストがあるので、なぜこのようなことが起こるのか理解できません。

受け入れられた回答

同じDbContextの1つ、2つ以上のインスタンスがある場合、接続ごとに1つのデータレアの制限がデータベースサービス側に存在するため、接続文字列でMultipleActiveResultSetsオプションを有効にする必要があります。

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

人気のある回答

これは、使用しているバージョンのバグかもしれないと考えてください。

MultipleActiveResultSetsをアクティブにしないと、 接続ごとに1つのDataReaderしか持てません。複数のコードが使用されているのを見ることができます。 efcoreがToListAsync()で正しく閉じず、MARSを有効にすると問題が隠されている可能性が非常に高いです。

RTMはあなたの質問が投稿されてからリリースされており、あなたの特定の問題は既によく修正されているかもしれません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ