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