Fluent-NHibernate乐观锁

Fluent-NHibernate乐观锁,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在尝试使用fluent nhibernate配置操作锁定 有很多信息,但似乎没有一个适合我的情况。我的课程和地图如下(为简洁起见编辑): 实体: public class EmailGroup : CRUDDomainObject<EmailGroup> { public virtual string Id { get; set; } public virtual MailServer Server { get; set;} public

我正在尝试使用fluent nhibernate配置操作锁定

有很多信息,但似乎没有一个适合我的情况。我的课程和地图如下(为简洁起见编辑):

实体:

public class EmailGroup : CRUDDomainObject<EmailGroup>
{        
    public virtual string Id { get; set; }
    public virtual MailServer Server { get; set;}
    public virtual string FromAddress { get; set;}
    public virtual string ToAddress { get; set;}
    public virtual long Version { get; set; }    
}

对于
版本
和SQL Server(不确定这是否是您的情况),最典型的scneario是SQL类型
时间戳
(过时)或更好的
行版本
。这应该映射到C#
字节[]
。因此,这些变化应该能够解决这个问题:

1) 服务器上的版本列必须是
rowversion
(或
时间戳
)类型。此类列将在与当前行相关的任何更改时自动更新。每个表只能存在一个这样的列

2) 实体应该是这样的

public class EmailGroup : CRUDDomainObject<EmailGroup>
{        
   ...
   public virtual byte[] Version { get; set; }  
公共类EmailGroup:CRUDDomainObject
{        
...
公共虚拟字节[]版本{get;set;}
3) fluent映射代码应该保持原样。这应该是fluent映射程序的工作,以完成其背后的技巧。我们需要实现的是以下内容:

<version name="Version" generated="always" unsaved-value="null"  type="BinaryBlob">
    <column name="Version" not-null="false" sql-type="timestamp"/>
</version>


请参阅此处的更多信息:

为什么指定
生成的.Always()
?它告诉NHibernate这不是一个实际列,而是由数据库计算的。文档:


删除它,它应该会工作。

Hi cremor,我已经修改了该行,因为您是对的,它设置不正确。但是它没有任何效果。事实上,这就是问题所在,它表明我在非托管对象上进行测试。您确定没有覆盖该映射部分的约定吗?也许还可以搜索对助手约定的调用代码中的,例如,
OptimisticLock.Is()
。感谢cremor,虽然映射没有被覆盖,但我似乎是针对错误的对象进行测试,而映射存在时,它没有被hibernate管理。将Generate更改为Never后,锁定工作正常。感谢Radim,虽然数据库在每次更新时都会增加此处的列,但NHibernate仍然不是g为乐观锁定生成正确的where子句,并且不生成过时的对象异常,这让我相信问题出在别处。我已经用生成的SQL更新了问题。我看不到更新。但我肯定会建议您在服务器上保留版本更新。这将确保,即使某些进程(批处理、管理…)将更改数据,版本将有所不同。我现在看到更新的版本。我在映射中唯一的区别是未保存的值,对于二进制blob为NULL。您能检查一下吗?其他设置对我来说都是一样的(我确实希望您使用的是
rowversion
,而不是
long
)感谢这个半径,问题现在解决了。投票支持你,因为我打算使用这个方法是第二阶段。
public class EmailGroup : CRUDDomainObject<EmailGroup>
{        
   ...
   public virtual byte[] Version { get; set; }  
<version name="Version" generated="always" unsaved-value="null"  type="BinaryBlob">
    <column name="Version" not-null="false" sql-type="timestamp"/>
</version>