NHibernate:插入子项时未更新的第一级缓存父对象

时间:2012-01-27 00:16:59

标签: nhibernate caching

我正在有效地执行以下操作:

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

但是,如果在Load调用之前,我调用session.Refresh(newParent),则Children将正确加载。所以它显然是在它有任何子节点之前缓存它,然后在添加它时不用新子节点更新缓存。

父映射:

<?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事务中。

2 个答案:

答案 0 :(得分:2)

您将孩子添加到父母的儿童收藏中的哪个位置?将newChild.Parent的引用设置为newParent不会将newChild添加到newParent的Children集合中,您必须这样做。这就是为什么将集合声明为私有成员(使用访问策略映射)并编写维护双方关系的AddChild和RemoveChild方法的常见做法。

答案 1 :(得分:0)

1)我做错了什么或这是默认行为?

有点,处理这个的正确方法是一次性添加它们并使用级联。但是,这不适合我的具体情况。

2)如果没有,解决这个问题的最简洁方法是什么?

没有特别干净的方法来解决这个问题。我已经将缓存中的父级刷新到测试体系结构中。

感谢Jamie和Phill。