2011-06-26 143 views
1

我有一個關於nHibernate的非常簡單的問題,但我真的找不到在谷歌上的答案。簡單的問題,從父母檢索更新的nhibernate對象集合

比方說,我有一個映射的Member對象,它將1:n外鍵保存爲Mail對象。我想在用戶進入他的收件箱時爲用戶檢索當前收集的郵件。如果我呼叫memberInstance.Mail(類型爲IList < \ Mail>),它會取回郵件收集,但不會反映自從memberInstance在登錄過程中保存在緩存中後添加的新郵件,並且不會往返數據庫。如果我創建了一個RetrieveMailForUser方法,將它傳遞給一個成員實例,然後調用代碼,如Session.CreateCriteria<Mail>我收到了任何給定成員和所有內容的當前郵件,但如果我從不使用它,因爲在不是最新的成員變量中有一個集合。每次用戶檢查收件箱並將其保存到緩存中時,我都可以刷新該成員,但這似乎有很多開銷。我覺得我錯過了nHibernate的一些基本原理。請幫忙。謝謝!

 public static Member GetLoggedInUser() 
     { 
      var member = (Member) HttpContext.Current.Session[SESSION_NAME]; 

      if(member != null && 
!NHibernateSessionManager.IsEntityAttachedToCurrentSession(member)) 
       NHibernateSessionManager.AttachEntityToSession(member); 
      return member; 


     } 

Ë

+1

您提到對集合的更改未反映在緩存項目中。我相信你的問題在於 - 當你從緩存中重新獲得這個項目時,你對對象所做的修改應該會被反映出來。你能提供一些關於如何初始化檢索成員對象並堅持它的更多信息嗎? –

+0

對不起,它保存在ASP網絡會話中,而不是緩存,我用檢索用戶的代碼編輯了我的原始問題。 – Eitan

回答

1

從您的文章我導出兩個矛盾的需求:調用成員

代碼

  1. 要在高速緩存中的對象(會員),這不應根據數據庫中發生的情況進行更新。它的本質不是自動重新加載任何東西或嘗試這樣做。

  2. 您希望成員對象的Mails集合中的郵件在被訪問時被更新(並因此忽略首次檢索成員對象時緩存中的內容)。

如果你要堅持第一種方法,你必須在緩存更新的成員對象直接每當該對象(調用member.AddMail(郵件)或類似的東西)創建一個新的郵件。我不知道這是否可行,因爲您明顯地讓會員保留在會話中,並且需要訪問其他會話的成員對象。

如果你還想'最新'的郵件列表,我想沒有辦法明確重新加載你的郵件列表,重新加載你的整個對象,或只是按照你的建議方式加載郵件已經(RetrieveMailForUser)。在這種情況下,您可以自信地刪除成員對象中的郵件集合。如果你不需要它們,你不必映射集合。

+0

我將你的回答標記爲答案,但我仍然有幾個問題。首先,我使用automapper來映射類,所以我不認爲我可以安全地將它們取出來,你怎麼看?其次,你如何顯式地重新加載郵件列表,是否有一個nhibernate函數,或者我會調用'RetrieveMailForUser'來重新填充它?感謝您的答案btw – Eitan

+0

我對automapper不熟悉,但是您是否試過在Member類中刪除Mails集合?對於重新加載,在你的情況下調用'RetrieveMailForUser'對我來說似乎很好。 – bonifaz