2013-02-12 34 views
1

在發佈這個問題之前,我已經看到了很多關於NH版本的例子,並且所有這些例子都告訴我使用下面的代碼;我可以使用MappingByCode版本化實體:NHibernate版本控制 - 調用ISession之後的異常.Save

Version(e => e.MyVersion, vm => { 
    vm.Generated(VersionGeneration.Always); 
    vm.UnsavedValue(0); 
}); 

我預計分配MyVersion應由SQL Server完成。所以當我調用ISession.Save或ISession.SaveOrUpdate; NHProf顯示生成的sql不包含傳遞給Insert語句的MyVersion參數(如預期的那樣),但查詢執行失敗,因爲SQL Server不生成它;結果是cannot insert null value into MyVersion column...錯誤。

我對VersionGeneration.Always的期望是正確的?所以怎麼了?

我使用NHibernate的3.3/SQL Server 2012的

回答

2

VersionGeneration.Always意味着NHibernate的應該期望數據庫系統同時生成的INSERT和UPDATE上的版本號。

但是您還需要告訴SQL Server它應該生成數字... 請參閱示例http://msdn.microsoft.com/en-us/library/ms182776.aspx

+0

嗯...其實我使用SchemaExport進行架構生成,所以我需要手動讓MyVersion通過SQL Server進行版本化?這太糟糕了:D – Sadegh 2013-02-12 16:11:22

+1

我懷疑它是在數據庫中生成一個int列。列自動更新的想法與列的類型正交。使用rowversion是一種選擇,但可以想象使用基於int + trigger或其他方法的解決方案。因此你也必須告訴NHibernate使用哪種類型。我在域中看到Byte []的示例,並將映射的sql-type設置爲rowversion。 – 2013-02-12 16:17:25

+1

換言之:generated =「always」只聲明NHibernate不應該生成一個值,因爲DB會這樣做,但它並不意味着_how_該值會生成。 – 2013-02-12 16:18:56