我切實做好以下一級緩存的父對象未更新: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事務中。
問題與此類似:http://stackoverflow.com/questions/1206452/hibernate-onetomany-with-mappedby-parent-child-relationship-and-cache-problem – Alistair 2012-01-27 00:27:48
你爲什麼要單獨保存它們?父母是你的根骨料,應該對孩子負責。 – Phill 2012-01-27 00:31:53
Phill,這是在整個應用程序中完成的,但是從測試項目(這是存在問題的地方)中,有用於創建父項或子項的基礎結構,它是創建新對象並調用session的全部一行方法調用。在上面。 Cascade可以用來解決我的問題,但它會涉及到測試對基礎設施API調用的複雜性,它會涉及基礎結構代碼的很多更改,以便理解關係以及如何處理它們。基本上,在這種情況下不使用級聯來保存更簡單。 – Alistair 2012-01-27 03:15:06