EntityFramework(CodeFirst)で楽観ロックを使う場合はTimeStampアノテーション使ったほうがいい |
時間を取得する理由として「楽観ロックを行うため」と書きました。
EntityFrameworkを利用する場合、
楽観ロックは素直にTimeStampアノテーションを使ったほうがよいです。
(その場合、DBの各テーブルに楽観ロック用のTimeStampカラム、
対応するEntityクラスにbyte配列が必須となります)
※SQLServerのtimestampやrowversionは
INSERTやUPDATEをするたびに自動的に増加します。
参考:rowversion (Transact-SQL)
http://technet.microsoft.com/ja-jp/library/ms182776.aspx
最近、EntityクラスのDateTime型のプロパティに
Concurrencyアノテーション付けて
楽観ロックにできないか試してました。
Concurrencyアノテーションのプロパティで楽観ロックを行う場合、
同時実行チェック後にDateTime型のプロパティを更新する仕組みと
それを読みだしてEntityインスタンスに反映する仕組みが必要になります。
(TimeStampアノテーションを使うとUPDATEとSELECTがセットで発行され、
上記の2機能を実現しています)
これを実現するには
・SQLServerでUPDATE(とINSERT)のトリガーを作成し、
DateTimeカラムを更新する。
・コード上でDBContext#SaveChanges()後に
DBContext#Entity(Entityインスタンス).Reload()を実行する
で反映できますが、
・SQLServerのトリガーはテーブル単位で作成する必要がある。
・DBContext#Entity(Entityインスタンス).Reload()を行うと
SELECTとEntityインスタンスのプロパティへの値セットが余分に行われる
と、実装も面倒ながら、実行コストも高いです。
私の判断では下記のどちらかになるかな?と考えています。
・EntityFrameworkの楽観ロック機能を使うなら
TimeStampアノテーションを活用する。
・DBのテーブルに楽観ロック用カラムを追加したくない場合は
EntityFrameworkの楽観ロック機能を使わない。
アプリ側での楽観ロックを実現する。
参考になれば幸いです。
よかったらクリックしてください。
にほんブログ村