2014-05-22 66 views
2

我有NHibernate的緩存對象的問題,並返回舊版本:NHibernate的緩存問題

這裏是我的代碼的運行

public IList<Foo> GetFoos() 
{ 
    return _session.Query<Foo>().Where(f => f.State == 0).ToList(); 
} 

public void Update(Foo foo) 
{ 
    foo.State = 1; 

    _session.Transaction.Begin(); 
    _session.Update(foo); 
    _session.Transaction.Commit(); 
} 

如果我在數據庫中有10個FOOS狀態0我打電話給GetFoos我得到10個Foo對象,狀態爲0,那很好。

如果我在每個Foo上調用Update數據庫會顯示狀態1中的10個foos,那很好。

現在,如果我打電話GetFoos我得到0美孚對象,這很棒。

如果外部應用程序將所有Foos的狀態更改爲狀態0,並且運行GetFoos方法,則返回10個對象,這很好。然而,所有的對象都處於1 !!!!!!狀態,這太可怕了!

現在,如果我在所有foos上調用Update,數據庫不會更新,因爲Nhibernate認爲沒有任何更改,所以它們永遠保持在數據庫中的狀態0。

我的配置有問題嗎,還是這種預期的行爲? 如何讓對象返回正確的新值?

感謝

回答

0

由會話(ISession實例)加載的實體將被保存在一級緩存。您可以清除它們全部(ISession.Clear()),也可以手動調用每個ISession.Refresh()以獲取數據庫中的當前值。

+0

我不明白爲什麼如果它使用它的緩存GetFoos方法將返回任何東西,至少返回沒有任何意義。目前,具有表達式'.Where(f.State == 0)'的方法將返回帶有'f.State = 1'的對象。 Nhibernate是否每次都在數據庫上運行查詢,但是從緩存中返回值? –