ホームページ >バックエンド開発 >C++ >Entity Framework コードで「セッション内で他のスレッドが実行されているため、新しいトランザクションは許可されません」がスローされるのはなぜですか?

Entity Framework コードで「セッション内で他のスレッドが実行されているため、新しいトランザクションは許可されません」がスローされるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-16 13:36:59315ブラウズ

Why Does My Entity Framework Code Throw

Entity Framework モデルの更新中にトランザクション エラーが発生しました

2 つの別々のデータベースからエンティティを接続しようとすると、開発者は次のエラーが発生する場合があります: "Newセッション内で他のスレッドが実行されているため、トランザクションは許可されません。」このわかりにくいメッセージは、複数のループと Entity Framework コンテキストを組み込んだコードを試行するときに発生する可能性があります。

根本的な問題は、Entity Framework (EF) が作成された各コンテキストのセッションを維持するという事実に起因します。複数のスレッドが同じコンテキストに同時にアクセスすると、トランザクションの競合が発生する可能性があります。これを解決するには、異なるスレッドで同じコンテキストを変更しないようにすることが重要です。

上記の例では、エラーの根本原因は、EF クエリに対するネストされた foreach ループの使用でした。このアプローチは、外側のループの反復ごとに新しい EF コンテキストが作成されることを意味し、その結果、多数のアクティブなセッションが同じコンテキストに同時にアクセスすることになります。

最適な解決策は、クエリを使用して EF からデータを取得し、それを保存することです。中間コレクション (例: IList)。これにより、トランザクションの競合が発生することなく、後続の反復ごとにコンテキストを破棄し、新しいコンテキストを作成できるようになります。

説明するために変更されたコードの例を次に示します。

IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a;
foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
{
   var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
    // ...
}

コンテキストからデータを取得することで、トランザクションが重複するリスクを排除し、エラーが発生しないことを保証します。

以上がEntity Framework コードで「セッション内で他のスレッドが実行されているため、新しいトランザクションは許可されません」がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。