1

我想使用nHibernate 3使用UnitOfWork模式來實現併發檢查。nHibernate和併發檢查

爲了更精確:

  • 打開新的會話的會話,會話中的
  • 負荷實體,
  • 關閉會話,
  • 給予用戶一些時間加載實體編輯數據,
  • 打開新的會話,
  • 更新數據
  • close session。

我正在使用timestap版本實體。

這裏是我的映射文件

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="...." 
        namespace="...." 
        default-lazy="false">  
    <class name="Employee" 
     optimistic-lock="version" 
       dynamic-update="true"> 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <version column="LastEditDate" generated="always" type="timestamp" /> 
    <property name="Name" not-null="1" length="255" /> 
    <property name="LastEditUser" not-null="1" length="255"/> 
    </class>  
</hibernate-mapping> 

我不知道如何在會話的上下文更新實體

var entity = <updated by user> 
using (var session = GetNewSession()) 
{ 
    //todo: load current version value/attach entity to context 
    session.SaveOrUpdate(entity); 
    //if concurency check fails, StaleObjectException (or similar) is expected to be thrown 
} 

在SQL應該像這樣工作

UPDATE ENTITY SET LastEditDate = @P1, ... WHERE ID = @P2 AND LastEditDate = @P3 

where: 
@P1 - new LastEditDate 
@P2 - entity ID 
@P3 - previous LastEditDate 

如果ROWSMODIFIED = 1則更新成功,否則如果= 0,則併發異常

使用Linq2Sql非常簡單:創建版本控制列,將實體附加到新的會話上下文並嘗試更新。

我該怎麼做nHiberate?它是否支持?

回答

0

我認爲你應該使用session.Lock(entity,LockMode.Update)

+0

我正在使用樂觀鎖定。我可能是錯的,但session.Lock看起來像是悲觀的鎖定場景。 – tomo 2011-03-26 10:52:16

+0

爲了將實體保存在另一個會話中,您需要將實體鎖定到較新的會話。 – 2011-03-26 10:59:26

1
session.Update(entity) 

應該足夠了。