0

EntityFramework4を介してデータベースにアクセスしています。

ポートでリッスンし、いくつかのメッセージを待機するサーバーがあります。メッセージが来ると、それはテーブル行に変換され、データベースに挿入される必要があります。ただし、一度に複数のメッセージが届く場合があります。メッセージごとに(TPLから)タスクを作成し、非同期で実行します。

これらの各タスクは、ObjectContextのインスタンスを作成し、適切なエンティティクラスのオブジェクト(DB内のテーブルを表す)を作成し、データをObjectContextに挿入してから、SaveChangesメソッドを呼び出します。

したがって、各スレッドは独自のObjectContextを作成しました。ObjectContextのインスタンスは、ObjectContextの他のインスタンスに影響を与えることができますか?このシナリオには副作用がありますか?

(挿入されたデータは参照整合性エラーを作成しないことに注意してください)。

4

2 に答える 2

5

あなたの状況では、トランザクションの整合性は、Entity Frameworkではなくデータベース(SQL Server)によって保証されます。SaveChanges()各スレッドには独自のコンテキストがあるため、各コンテキストが別のコンテキストに干渉することを心配する必要はありません。

の1つのインスタンスがObjectContext別のインスタンスに影響を与えることはできません。別のコンテキストでの後続が失敗するSaveChanges()ような方法でデータベースを変更する状況に遭遇する可能性があります。SaveChanges()ただし、これは仕様によるものであり、SQLServerが制約を適用した結果です。

于 2011-12-13T14:50:53.867 に答える
1

データコンテキストは通常​​、スレッドセーフではありません。しかし、それらはすべて独立しているため(要求ごと)、問題にはなりません。

過度に単純化された答えは、コンテキストが無関係であるという点で「いいえ」です。ただし、データベースと通信するものは、の前に実行するクエリ、SaveChangesファントムまたは繰り返し不可能な読み取りであることが判明したかどうか、または別のリクエストによっても更新されたデータを更新しているものがあるかどうかによって、エッジ条件が発生する可能性があります。または、個別に問題はないが、組み合わせて一意の制約に違反する、異なるリクエストに対して2つの挿入を実行するなど。

于 2011-12-13T14:50:14.103 に答える