2011-06-22 73 views
2

我有兩個實體有一對多的關係,這些是用戶和地址。一個用戶可以有很多地址。我爲每個HTTP請求模式使用一個會話和事務,並啓用了1級緩存。出於某種原因,我看到我的懶加載的集合沒有處理對數據所做的更改。例如,如果我創建一個用戶對象。然後,我創建了兩個地址對象,做斷言我期待用戶對象延遲加載兩個地址時節省他們像NHibernate緩存故障

User u1 = CreateNewUser("[email protected]", "[email protected]"); 
u1.Save(); 

Address a1 = CreateNewAddress(u1, "[email protected]", "Old1", "User1"); 
a1.Save(); 
Address a2 = CreateNewAddress(u1, "[email protected]", "Old1", "User1"); 
a2.Save(); 
Session.Flush(); 
Assert.AreEqual(2, u1.Addresses.Count); // THIS IS FAILING BECAUSE COUNT IS 0 

現在和計數應該是2,但它返回0。如果我只是做扔掉完整緩存Session.Clear()調用也不起作用。但是,如果我通過執行Session.Clear()來拋棄完整緩存,然後以這種方式再次加載我的用戶對象,它將按預期工作。我不知道我是否錯過了一些東西,或者在NHibernate緩存設置配置中還是缺少一些東西。任何幫助將不勝感激。

感謝

回答

0

您必須將地址添加到用戶類太...通常會看到人民創造的方法u1.AddAddress(A1);它將在地址對象上設置對用戶的引用並將其添加到用戶的地址列表中。

+0

嗯,我是新來的NHibernate但我認爲這是假設由NHibernate的工作要做。我認爲在同一個會話中,NHibernate會跟蹤所有更改並通知相關的項目。情況並非如此。 – Leadfoot

+0

呃...我假設你的User類有一個地址列表。如果您希望Count()爲2,那麼您需要添加到該列表中.NH不會爲您執行此操作,除非您再次從DB重新加載對象。 – Todd

0

這裏的默認事務類型是讀取提交的,因此您需要在每個Save()後更改Flush()或更改事務類型。

1

您應該將地址添加到用戶對象或刷新用戶對象(從數據庫中重新加載):

Session.Flush(); 
Session.Refresh(u1); 
Assert.AreEqual(2, u1.Addresses.Count);