2009-01-11 52 views
4

我已經將FlushMode.Never的NHibernate會話設置爲FlushMode屬性,但是當我調用session.Save(User)時,無論如何都會對數據庫進行調用。這是應該如何工作?我認爲它不應該做一個插入,直到我叫Flush()。保存NHibernate FlushMode

編輯: 我發現這個問題,我改變了主鍵guid,它的工作。是否還有其他類型(即沒有guid主鍵)可以使用?我寧願有一個數字,而不是一個GUID ...

+0

有幾個ID發電機各地NH - http://nhforge.org/blogs/nhibernate/archive/2009/03/20/nhibernate-poid-generators- reveal.aspx or http://ayende.com/Blog/archive/2009/03/20/nhibernate-avoid-identity-generator-when-possible.aspx – Rashack 2009-04-28 08:13:21

回答

8

您正在使用本地生成器,對不對?

這個問題在於,由於它是生成ID的數據庫,因此NHibernate需要往返才能獲取它。例如,對於服務器標識字段,必須在SCOPE_IDENTITY()返回有效密鑰之前執行實際的INSERT語句。而安全執行此操作的唯一方法是刷新會話。

作爲替代的GUID和身份,你可以試試「增量」發電機,看它是否適合您的需要: http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping.html#mapping-declaration-id-generator

你應該知道,如果你集羣您的應用程序這種做法是不可行,或者你有一些其他進程或應用程序插入到同一個表中。

PS:進一步閱讀的嘗試http://unhandled-exceptions.com/blog/index.php/2008/12/11/on-choosing-an-identity-type/

1

我發現這個問題,我正在使用身份作爲主鍵。改變它爲GUID工作。

0

嘗試在事務中包裝session.Save(用戶)並將FlushMode設置爲Commit。

這應該確保沒有調用數據庫。

+0

我可能是錯的,但我認爲它仍然稱爲數據庫,當生成器設置爲Identity時,即使在事務中並且FlushMode爲Commit時也是如此。 – NotDan 2009-01-16 03:28:42