2012-10-30 42 views
4

我遇到了一個明顯的緩存問題,即NHibernate返回的內容與數據庫中的內容不匹配。NHibernate緩存問題 - 何時調用Evict?

我相信這是level2緩存數據。它看起來像我可以使用Evict來做到這一點,但實際上應該調用Evict方法嗎?對於我的特殊應用,數據對用戶來說是唯一的,而且提供的數據可能只會被使用一次*。

我可以完全禁用這些對象集的Level2緩存嗎?

UPDATE 10/31

我的情況是這樣的:我有凡客將是添加和刪除項目的購物車。我正在做的事情如下:在處理購物車更新之前,我驅逐了CartCartProduct實體。完成此操作後,我從提供程序中檢索CartProducts列表,並返回視圖(這發生在.NET MVC控制器中)。

UPDATE 11/3

的購物車已經被完成了,我跑進那似乎是與同一NHibernate的問題的問題,但實際上是一個MVC的問題。深入挖掘表明,HTML Helper擴展覆蓋了我認爲的值,並取而代之的是處於Model狀態的內容。所以在這一個雙重打擊。希望這可以幫助某人。

回答

18

不,您不能禁用某些實體的緩存。

你確實有幾種選擇:

  1. 使用ISession.Clear()從NHibernate的緩存中清除所有實體。
  2. 使用ISession.Evict(OBJ)從緩存中清除特定實體。
  3. 使用ISessionFactory.Evict(typeof運算(OBJ))驅逐所有實體/從高速緩存的特定類型的對象。在我看來,這將是最接近你想要的。
  4. 使用IStatelessSession從數據庫中獲取的對象/實體,因爲這完全繞過所有緩存。
+0

蘭迪,感謝您的鏈接。你能詳細闡述一下evit的正確用法嗎?我在上面對我的實際使用做了一些說明,但這似乎是完全錯誤的做法。在對數據庫做任何事之前,必須先給Evict打電話是很荒謬的。使用MySQL FWIW。 – Brian

+1

Evict()從NHibernate會話中刪除/解除關聯對象。它的用途是當你不希望一個對象持久/保存回數據庫時。例如,您可以從數據庫中加載現有的購物車,Evict()購物車實體,並在會話中保存購物車實體。然後,當用戶到達購物車的末尾時,可以將其保存回數據庫。這個例子可以讓你的購物車在每次換頁時不必從數據庫中重新加載。這是一個有點人爲的例子,但聽起來很合理。 –

+0

關於你的第二條評論和你的問題的更新,是的,它看起來似乎沒有正確設置,因爲你不應該真的需要爲你的用例從會話中抽取對象。不幸的是,在我們能夠縮小真正的問題之前,我需要了解您的應用程序。有些事情需要研究,確保你沒有使用與你的視圖模型相同的實體,確保你正在使用事務,確保在處理你的NHibernate會話之前正確地提交你的事務。 –