我目前對創建具有版本字段的實體的映射感興趣。但是,我對如何在Web環境中使用版本控制感到困惑。在大多數例子中,我看到一個實體在一個使用語句中更新,這個語句立即發生。NHibernate版本控制
在一個web示例中,實體在HTTP GET中獲取並且在客戶端調用HTTP POST之前不會更新。我通常在帖子中做的是再次獲取實體,更新數據並存儲它。但是那個實體可能在我的GET和POST之間的時間內發生了變化。在我保存之前,我應該自己檢查版本字段還是有更好的方法?
我目前對創建具有版本字段的實體的映射感興趣。但是,我對如何在Web環境中使用版本控制感到困惑。在大多數例子中,我看到一個實體在一個使用語句中更新,這個語句立即發生。NHibernate版本控制
在一個web示例中,實體在HTTP GET中獲取並且在客戶端調用HTTP POST之前不會更新。我通常在帖子中做的是再次獲取實體,更新數據並存儲它。但是那個實體可能在我的GET和POST之間的時間內發生了變化。在我保存之前,我應該自己檢查版本字段還是有更好的方法?
是的,我想你需要自己檢查一下。你可以這樣做的一種方式是,當你在初始get中獲取實體並將其發回給調用者時,在響應中包含版本號。 當你做你的文章,包括版本號。在服務器端,當您重新讀取附加的nHibernate實體時,請從中獲取當前的版本號。如果您的版本號已過期,請停止更新。
版本1)可以手動檢查或2)依靠NHibernate內置的版本控制功能和時間戳類型在數據庫中。 (SQL Server支持它 - 但很可能其他DB以某種方式執行)。在第二種情況下,我們必須處理exception
。
有詳細的解釋如何併發可以在NHibernate的http://ayende.com/blog/3946/nhibernate-mapping-concurrency
如果處理您正在使用SQL Server的工作,你可以創建列
CREATE TABLE [dbo].[MyTable](
...
[Version] [rowversion] NOT NULL -- new keyword for deprecated [timestamp]
...
然後調整版本映射:
<version name="Version" generated="always" unsaved-value="null" type="BinaryBlob">
<column name="Version" not-null="false" sql-type="timestamp" />
</version>
而且您還應該/需要將版本號號碼傳遞給cl並在POST上綁定它(例如,作爲base64
)
每當你將嘗試session.Update(entity)
,其中有老版本的值,那麼在數據庫,NHibernate的會拋出NHibernate.StaleObjectStateException
。只有在這種情況下,你才能處理它。如果版本匹配,所有將正常工作,UPDATE語句將成功。
這是併發檢查難以實現的地方,因爲您必須將更改的內容傳達給用戶並提供合併其更改的方法。 –