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 サイトの他の関連記事を参照してください。