我切实做好以下一级缓存的父对象未更新: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