3

楽観的並行性チェックを実装しようとしています。私は一般的なリポジトリと作業単位のパターンを利用しています。

タイムスタンプ属性のプロパティ (バイト配列として) をエンティティに導入しました。これにより、データを更新するたびに値が自動的に増加します (データベースで管理されているようですが、これが本来の目的です)。

(オートマッパーを使用して) VM を実際のモデルにマッピングすることにより、ビュー モデルから更新された値を読み込みます。これにより、適切なタイプのエンティティの新しい (切り離された?) インスタンスが生成され、対応するすべてのフィールドが設定されます (タイムスタンプを含む)。

更新自体は次のように実行されます

i_oOldEntity =  m_oDbSet.Find(i_oEntity.MaterialId)
context.Entry(i_oOldEntity).CurrentValues.SetValues(i_oEntity)
context.SaveChanges()

i_oEntity は自動マッピングされたエンティティです。

これにより、値自体は正常に更新されますが、ビューモデルからのタイムスタンプ値は完全に無視されます。結果の SQL コードでは、WHERE 句で最新の rowversion 値が使用されます。

要するに: EF の WHERE 句で使用されるビューモデルのタイムスタンプ値を取得するにはどうすればよいですか?

4

2 に答える 2

0

仮定:

var target = dbContext.Employees.Find(dto.Id);

この手法により、更新時に EF5 が where 句で dto の Timestamp 値を使用し、dto の Timestamp がデータベースの Timestamp 値と一致しない場合、オプティミスティック コンカレンシー例外がトリガーされます。

context.Entry(target).Property(o => o.Timestamp).OriginalValue = dto.Timestamp;
context.Entry(target).Property(o => o.Timestamp).IsModified = true;

更新OriginalValueだけでは、EF5 では何も実行されません。

于 2013-09-09T15:00:19.643 に答える
-2

更新OriginalValues->RowVersionしてください、そうすれば楽園に着きます =)

于 2013-01-23T09:54:45.867 に答える