Entity Frameworkでは、これを「アトミック」操作にすることはできません。手順があります:
- データベースからエンティティを読み込む
- メモリ内のカウンタを変更する
- 変更したエンティティをデータベースに保存
これらの手順の間に、別のクライアントがデータベースからエンティティをロードできますが、それでも古い値が残っています。
この状況に対処する最善の方法は、楽観的同時実行制御を使用することです。 。これは基本的に、カウンターがステップ1でエンティティをロードしたときと同じでなくなった場合、ステップ3での変更が保存されないことを意味します。代わりに、エンティティをリロードして処理できる例外が発生します。変更を再適用します。
ワークフローは次のようになります:
-
Work
でWordCount
のエンティティ プロパティは同時実行トークンとしてマークする必要があります(コードファーストの場合はアノテーションまたはFluent API) - データベースからエンティティを読み込む
- メモリ内のカウンタを変更する
-
SaveChanges
を呼び出しますtry-catch
で タイプDbUpdateConcurrencyException
の例外をブロックしてキャッチします - 例外が発生した場合は、
catch
でエンティティをリロードします データベースからブロックし、変更を再度適用して、SaveChanges
を呼び出します もう一度 - 例外が発生しなくなるまで、最後の手順を繰り返します
この回答
この手順のコード例を見つけることができます(DbContext
を使用) 。