2009-01-29 18 views
0

我使用Fluent NHibernate來映射ProductCategory樹,並且一切都很順利,直到我試圖走過從數據庫返回的樹以確保其正確保存和檢索爲止。NHibernate不會從會話中驅逐對象

這裏是我如何測試:

  1. 實例化4類:飲料,啤酒,淡啤酒和黑啤酒
  2. 添加啤酒飲料,然後淡啤酒和黑啤酒到啤酒。
  3. 保存飲料(級聯設置爲AllDeleteOrphan)
  4. 刷新了會議,其中持續整個樹
  5. 逐出每個會話中的ProductCategories從數據庫
  6. 檢查加載
  7. 負載飲料對象(fromDB)是EqualTo但不是SameAs Beverages。
  8. 檢查fromDB只有一個子產品分類
  9. 檢查中fromDB獨生子女是EqualTo但因爲孩子是sameAs的啤酒不sameAs的啤酒

測試失敗。這意味着它實際上並沒有從數據庫中加載對象,因爲它仍然處於NHibernate會話的某個地方。

任何見解將不勝感激。

編輯:迴應肖恩的評論如下。我正在使用內存SQLite數據庫,所以一旦會話/連接關閉,數據庫就會被吹走。

回答

1

剛剛算出來,原來它是一個複製&粘貼錯誤。 Heh,PEBKAC。

我加4個斷言驗證對象不在會話:

Assert.That(Session.Contains(_beveragesCategory), Is.False); 
Assert.That(Session.Contains(_beerCategory), Is.False); 
Assert.That(Session.Contains(_darkBeerCategory), Is.False); 
Assert.That(Session.Contains(_lightBeerCategory), Is.False); 

當所有這些通過(我第一次遇到他們)我把在代碼仔細看看這是斷言的物體不同並發現斷言是錯誤的。

那句話:

Assert.That(_beverageCategory.ChildCategories[0], Is.Not.SameAs(_beerCategory)); 

本來應該是:

Assert.That(fromDB.ChildCategories[0], Is.Not.SameAs(_beerCategory)); 
0

從測試的角度來看,您最好關閉用於創建對象和創建新會話以檢索對象的初始會話。這將確保數據庫被再次命中以實例化對象(假設第二級緩存未啓用)。

+0

感謝您的回答,我在編輯的問題作出迴應。 – RKitson 2009-01-29 02:34:43