私のプロジェクトはSQL Server 2012に対してEF(自己追跡テンプレートを使用したバージョン4およびデフォルトのテンプレートを使用したバージョン5でテスト済み)を使用しています。データベーステーブルにはそれぞれrowversion
( timestamp
)列が定義されています。
その中心にEFを使用します。データベースの更新に関する私のコードは、次のようになります。
using (var db = new MyContext())
{
//db.Entry(myInstance).State = EntityState.Modified;
db.SaveChanges();
}
rowversion
アラートをトリガーしません。私は並列クライアントを実行し、それぞれが同じレコードを読み込み、それに変更を加え、そしてそれをそれぞれデータベースに書き込みます。すべての更新が受け入れられ、並行性は適用されません。
私は(私の述べwhere句で私の更新コマンドのためのストアドプロシージャで作業する必要がありますかrowversion
EFは、「組み込み」の同時実行を認めるか、私のコードを作るための別の方法(設定、特定のメソッド呼び出し)がある持っている値)作業?
RowVersion
(又はTimeStamp
のフィールドタイプ) SQL
(必須であると自己インクリメントを除く)、他などのフィールドです。更新時にその値を特定のデータベースで処理する(つまり、値を増やす)が、更新前にその値を比較する特定のデータベース処理はありません。 EF
では、各フィールドにConcurrencyMode
を定義できます( edmx
)。必要に応じて、すべてのフィールドにConcurrencyMode=Fix
(デフォルトのNone
ではなく)を付けて、更新のwhere句にすべてのフィールドを含める(エンティティの元の値とデータベース内のレコードの現在の値を比較する) 。しかし、このモードではエンティティごとに1つのフィールド、つまりRowVersion
フィールドを設定する方が簡単です。特にあなたのためにそれを維持している唯一のパーティーはデータベースです。 System.Data.OptimisticConcurrencyException
分離エラーが発生しているSystem.Data.OptimisticConcurrencyException
です。 myObjectSet.Attach(myEntity)
使用するなど、オブジェクトセットを操作するEF
ワークフローから遠ざける必要があります。これは、現在のデータを取得して変更内容をマージするためにデータベースにmyObjectSet.Attach(myEntity)
ます。 RowVersion
フィールドは通常変更されていないため、更新はデータベースからの現在の値でトリガされ、同時実行性例外は発生しません。