【发布时间】:2013-06-30 04:00:49
【问题描述】:
我正在尝试使用 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; }
}
地图:
public class EmailGroupMap : ClassMap<EmailGroup>
{
public const string TABLE_ID = "EMAILGROUP";
public const string FIELD_ID = "EMAILID";
public const string FIELD_MAIL_SERVER = "MAILSERVID";
public const string FIELD_FROM_ADDRESS = "EMLFROM";
public const string FIELD_TO_ADDRESS = "EMLTO";
public const string FIELD_VERSION = "VERSION";
public EmailGroupMap()
{
Table(TABLE_ID);
Id(x => x.Id)
.Column(FIELD_ID)
.Not.Nullable()
.GeneratedBy.Assigned()
.Length(12);
References(x => x.Server)
.Column(FIELD_MAIL_SERVER)
.NotFound.Ignore();
Map(x => x.FromAddress)
.Column(FIELD_FROM_ADDRESS)
.Not.Nullable()
.Length(120);
Map(x => x.ToAddress)
.Column(FIELD_TO_ADDRESS)
.Not.Nullable()
.Length(1000);
Version(X => X.Version)
.Column(FIELD_VERSION)
.Generated.Always()
.UnsavedValue("0")
.Access.Property();
DynamicUpdate();
OptimisticLock.Version();
}
}
在我看来一切都很好,但是当我加载实体并对其进行修改时,版本号不会增加。同样,如果我在会话打开时手动增加版本,我不会收到 StaleObjectException。
这个配置对于更有经验的人来说是否有效?如果是这样,我还能错过什么?
更新:
在实现数据库管理的时间戳之后,版本列(当然)正在递增。然而 NHibernate 不会将该行视为乐观锁定。我从 SQL 服务器捕获了更新查询以检查 where 子句(为简洁起见被截断):
exec sp_executesql N'UPDATE [EMAILGROUP]
SET [EMLDESC] = @EMLDESC, [MAILSERVID] = @MAILSERVID, [EMLFROM] = @EMLFROM, [EMLTO] = @EMLTO, [EMLCC] = @EMLCC, [EMLBCC] = @EMLBCC
WHERE [EMAILID] = @EMAILID'
【问题讨论】:
-
您确定没有覆盖该映射部分的约定吗?也许还可以在您的代码中搜索对帮助程序约定的调用,例如
OptimisticLock.Is(<something>). -
感谢 cremor,虽然没有覆盖映射,但似乎我正在针对错误的对象进行测试,虽然映射存在,但它不是由 hibernate 管理的。将 Generated 更改为 Never 后,锁定工作正常。
标签: nhibernate fluent-nhibernate