バージョン フィールドを使用して、ASP.NET MVC 4 アプリケーションで同時実行を制御しています。
マッピング:
<class name="User" table="Users">
<id name="Id">
<generator class="native"/>
</id>
<version name="Version" column="Version"/>
... other fields omitted for brevity...
実在物:
public class User
{
public virtual int Id { get; set; }
public virtual int Version { get; set; }
... other fields omitted for brevity...
私は次のアプローチを使用しています。
- Id でエンティティを読み取り、UserDto エンティティにマップします (Dto はデータ転送オブジェクト パターン用です)。Version フィールドも含まれます
- UserDto エンティティを編集するためのフォームを表示する
- POSTed UserDto エンティティを受け取る
次に、次のことを行います。
// read the original entity from the database using my repository wrapper around NHibernate
var rep = RepositoryFactory.Create<User>(currentUnitOfWork);
User originalEntity = rep.GetById(userDto.Id);
// optimistic lock control - keep the version as the user saw it
originalEntity.Version = userDto.Version;
... other fields omitted for brevity...
rep.Update(originalEntity);
問題は、userDto.Version が originalEntity.Version と一致しない場合でも、NHibernate は私の userDto.Version を無視し、originalEntity.Version を使用することです (明らかに、エンティティが読み取られたばかりなので、最初のレベルのキャッシュから)。このような動作により、私の Version フィールドは完全に役に立たなくなります。
NHibernate に、キャッシュされたバージョンではなく、提供されたバージョンの値を使用させるにはどうすればよいですか?
また、私のリポジトリを使用している他のプログラマーに対してバージョン管理をより透過的にすることは素晴らしいことですが、現在、受信したエンティティからバージョンを自動的に取得し、NHibernate にプログラマーなしでそれを使用させる方法がわかりません。気づいても。
何か案は?