2012-01-27 41 views
0

我切實做好以下一級緩存的父對象未更新:NHibernate的:當一個孩子被插入

session.Save(newParent); 

newChild = new Child(parent: newParent); 

session.Save(newChild); 

session.Load<Parent>(newParent.Id).Children.Count //0 - calling Get has the same result 

但是,如果加載調用之前,我打電話session.Refresh(newParent)孩子們會正確加載。所以它明顯地在父節點有子節點之前緩存,然後在添加新子節點時不更新緩存。

父映射:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="MyApp.Models.Entities.Parent,MyApp" table="[Parent]" lazy="true" batch-size="100"> 
    <id name="ParentId" column="ParentId" type="int"> 
     <generator class="native" /> 
    </id> 
    <bag name="Children" inverse="true" lazy="true" cascade="delete" batch-size="100"> 
     <key column="ParentId" /> 
     <one-to-many class="MyApp.Models.Entities.Child,MyApp" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

子映射:

<?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="MyApp.Models.Entities.Child,MyApp" table="[Child]" lazy="true" batch-size="100"> 
    <id name="ChildId" column="ChildId" type="int"> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="Parent" column="ParentId" cascade="save-update" /> 
    </class> 
</hibernate-mapping> 

我的問題是1)我做得不對或這是默認的行爲? 2)如果沒有,解決這個問題的最簡潔的方法是什麼?

這個問題實際上只發生在測試項目中,我可以調用底層測試體系結構在這種情況下在後臺執行強制刷新,但我想在實現解決方案之前完全理解正在發生的事情。

使用NHibernate 3.2,一切都包裝在ReadCommitted事務中。

+0

問題與此類似:http://stackoverflow.com/questions/1206452/hibernate-onetomany-with-mappedby-parent-child-relationship-and-cache-problem – Alistair 2012-01-27 00:27:48

+1

你爲什麼要單獨保存它們?父母是你的根骨料,應該對孩子負責。 – Phill 2012-01-27 00:31:53

+0

Phill,這是在整個應用程序中完成的,但是從測試項目(這是存在問題的地方)中,有用於創建父項或子項的基礎結構,它是創建新對象並調用session的全部一行方法調用。在上面。 Cascade可以用來解決我的問題,但它會涉及到測試對基礎設施API調用的複雜性,它會涉及基礎結構代碼的很多更改,以便理解關係以及如何處理它們。基本上,在這種情況下不使用級聯來保存更簡單。 – Alistair 2012-01-27 03:15:06

回答

0

1)我做錯了什麼或者這是默認行爲?

有點,正確的方法來處理這將是一次性添加它們並使用級聯。但是,這不適合我的特殊情況。

2)如果不是,那麼最簡潔的方法是什麼?

有沒有特別乾淨的方法來解決這個問題。我已經將高速緩存中的父進程刷新到測試體系結構中。

謝謝傑米和菲爾。

2

您要將孩子添加到父母的Children集合中?將newChild.Parent的引用設置爲newParent不會將newChild添加到newParent的Children集合,您必須這樣做。這就是爲什麼將這些集合聲明爲私有成員(使用訪問策略進行映射)以及編寫維護雙方關係的AddChild和RemoveChild方法的慣例。

+0

不通。我希望NHibernate會認識到已經添加了一個孩子,並且緩存的父母需要刷新/新的孩子將不得不被添加到孩子列表中。它看起來像我需要手動刷新 – Alistair 2012-01-29 22:40:36

相關問題