2009-04-20 46 views
15

是否有可能在nHibernate中創建只讀連接?如何在nHiberate中創建只讀會話?

只讀:其中nHibernate不會隱式或顯式清除對基礎數據庫的任何更改。

當關閉一個nhibernate連接時,它會自動清除對該持久對象的更改。

將刷新模式設置爲從來沒有是一種方式 - 但是可逆的(即某些代碼可以重置刷新模式)。

+0

我知道這是一個古老的(在互聯網時間)的問題,但是你關心這個問題的原因是什麼「可逆的」? – 2014-05-13 13:32:39

回答

13

我認爲你已經找到了解決方案,將flush模式設置爲永遠不會。是的,它是可改變的,但即使不是,代碼也可以簡單地創建另一個具有不同刷新模式的會話。

我認爲適當的解決辦法是建議只讀與session.FlushMode = FlushMode.Never使用到只有SELECT權限(或者是適合您的情況),與數據庫的連接強制執行。通過允許類似ReadOnlySessionFactory.Create()的方式維護單獨的ISessionFactory工廠可能會有所幫助。

0

累積更新,只是從來沒有沖洗似乎是一個不好解決了我。 我發佈了一個類似的問題。提供的解決方案使用不同的方法。所有事件都設置爲空,因此被忽略。我的感覺是,這是一個更好的方法。

我很驚訝,這不容易做到。我喜歡使用擴展方法的實體框架方法.AsNoTracking()確保只讀查詢保持這種狀態。

How to create an NHibernate read-only session with Fluent NHibernate that doesn't accumulate updates?

+0

不,更新不會在設置session.FlushMode = FlushMode.Never之後累積。我通過在你的問題中覆蓋SaveOrUpdateEventListeners來檢查它,並且偵聽器不會用FlushMode.Never調用。在您的解決方案中,每次更改都會調用NoOpEventListener – razon 2015-01-11 18:17:33

1

有NHibernate的一個較新的只讀功能(我不知道是哪個版本,但它在3.3.0肯定的)。您可以使用此設置將會話設置爲只讀:

session.DefaultReadOnly = true 

它禁用舊值的緩存並因此提高性能和內存消耗。

NHibernate reference documentation中有一個chapter about read-only entities