2012-07-24 74 views
1

我們有一個使用NHibernate進行.net模塊持久性的brownfield多用戶應用程序(99%Delphi,1%.net)。在我的應用程序中,我可以爲某個實體添加類別。如果我選擇一個並決定不使用它(因此再次刪除類別),我已經被NHibernate加載並保留在會話的一級緩存中。現在,如果其他用戶刪除了這個類別,我嘗試保存我的實體,那麼我的應用程序會拋出一個異常,因爲加載的對象不再存在。從NHibernate的一級緩存中刪除已刪除的項目?或者:如何檢查緩存的項目是否已被刪除?

我的問題:有沒有辦法來檢查我的緩存是否已加載不再存在的項目?如果是這樣,有沒有辦法從我的緩存中刪除不存在的實體?

所以會發生什麼: 我加載一個實體(添加到會話緩存) 我添加類別(添加到會話緩存) 別人從數據庫中刪除的類別。 我保存我的實體併發生異常,因爲該類別不再存在。

它仍然在會話緩存中。如果我可以(自動)將它從會話的緩存中刪除,那將會很好嗎?有沒有辦法清理緩存並刪除不存在的對象?

問候,泰德

回答

2

有NHibernate的任何選項來自動做到這一點,至少不會與ISession。您可以使用IStatelessSession進行加載,因爲它沒有第一級緩存,但是會丟失ISession提供的許多other features

您也可以撥打ISession.Clear()來清除會話(第一級)緩存或ISession.Evict()以從會話中逐出某些實體,但這不是自動的。

你會保持你的會話對象多久?也許你需要一個不同的會話管理context

如果會話的使用壽命較短,仍然可以實現實體緩存,但使用second-level cacheSysCache2second-level cache providers之一,它支持SqlCacheDependency。這意味着您可以在數據庫中的某些對象發生更改時設置緩存過期。