2009-12-26 90 views
0

在我的asp.net應用程序中,我打開並關閉/刷新每個請求開始/結束時的會話。如果您使用naitive身份,對象是否會立即持續存在?

採用這種設置,我認爲這將導致了諸如:

實體E = EntityDao.GetById(1);

e.Property1 =「blah」;

EntityDao.MakePersistant(e);

e = EntityDao.GetById(1);

e.Property1 //這不會是胡說,這將是舊值,因爲請求沒有刷新

但我注意到,返回的值是最近更新的值。 有人迴應說,因爲他們的方式我有我的身份設置?

有人可以解釋這種行爲嗎?所以我不需要調用flush來確保它堅持到db?

回答

0

我相信(但可能會誤),nHibernate的緩存和變更跟蹤是其原因。

由於此會話實例仍處於活動狀態,nHibernate正在跟蹤您對「e」所做的更改。當你再次要求它時,它會包含返回對象中的這些更改。當您調用MakePersistant(我假設調用Session.SaveOrUpdate(e))時發生的事情是,它告訴Session實例您將保存這些更改,因此它知道它們,並在您調用Session.Get時仍然顯示它們id)。

如果您改爲啓動另一個會話,然後調用Session.Get(id),如果您沒有調用Flush(或關閉事務,因爲您應該在此處使用Transaction),則不會看到這些更改,因爲它知道在另一屆會議上所做的改變沒有任何改變。

要回答您的其他問題,是的,您仍然需要調用Flush或關閉事務以確保將更改寫入數據庫。有一點很簡單,就是你實際上不需要調用SaveOrUpdate(e)。例如該代碼將導致更新到數據庫:

 using (var session = SessionFactory.OpenSession()) 
     using (var trans = session.BeginTransaction()){ 
      var e = session.Get(id); 
      e.Name = "New Name"; 
      trans.Commit(); 
     } 

NHibernate的知道,因爲它被追蹤了該屆會議期間所做的修改更新「E」。當我提交這個交易時,他們被寫入。請注意,這是默認行爲,我相信如果您要求調用.SaveOrUpdate(),則可以更改它。

+0

實際上看着sql profiler我看到數據庫調用是在會話期間進行的,因此它正在打擊db而不是從緩存中。 – mrblah 2009-12-28 23:17:23

+0

你的MakePersistent()函數是什麼樣的?那可能是調用Session.Flush。 – 2009-12-28 23:22:09

相關問題