我想配置使用流利nhibernate操作鎖。流利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。
此配置看起來對更有經驗的眼睛有效嗎?如果有的話,我還能找到什麼?
UPDATE:
執行(當然)的數據庫管理時間戳版本的列之後被遞增。然而,NHibernate不會將該行視爲樂觀鎖定。我捕獲從SQL Server的更新查詢,以檢查在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()'。 –
cremor
感謝cremor,雖然它不是映射被忽略,但它似乎是在對錯誤的對象進行測試,而映射存在時它並沒有被hibernate管理。更改生成後從不鎖定工作就好了。 –