我正在使用 Version 字段来控制 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(显然,来自一级缓存,因为刚刚读取了实体)。这种行为使我的版本字段完全无用。
如何强制 NHibernate 使用我提供的版本值而不是缓存的值?
此外,以某种方式使版本控制对使用我的存储库的其他程序员更加透明会很棒,但目前我不知道如何让它自动从接收到的实体中获取版本并强制 NHibernate 在没有程序员的情况下使用它甚至注意到它。
有任何想法吗?