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

NHibernate:插入子对象时未更新第一级缓存父对象,nhibernate,caching,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 session.Save(newParent); newChild=新子级(父级:newParen

我有效地做到了以下几点:

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.Save(newParent);
newChild=新子级(父级:newParent);
session.Save(newChild);
session.Load(newParent.Id).Children.Count//0-调用Get具有相同的结果
但是,如果在Load调用之前调用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事务中。

您在哪里将子项添加到父项的子项集合?设置从newChild.Parent到newParent的引用不会将newChild添加到newParent的Children集合,您必须这样做。这就是为什么通常的做法是将集合声明为私有成员(使用访问策略进行映射),并编写AddChild和RemoveChild方法来维护双方的关系。

1)我是做错了什么,还是这是默认行为

在某种程度上,正确的处理方法是一次性添加它们并使用级联。然而,这不适合我的特殊情况

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

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


谢谢Jamie和Phill。

问题与此类似:为什么要分别保存它们?父级是您的根聚合,应该负责子级。Phill,这是在整个应用程序中完成的,但是从测试项目(存在问题的地方)有一个用于创建父级或子级的基础结构,这都是创建新对象并调用会话的单行方法调用。保存在该基础结构上。Cascade可以用来解决我的问题,但它会使测试对基础设施的API调用变得复杂,并且会对基础设施代码进行大量更改,以便它了解这些关系以及如何处理它们。基本上,在这种情况下,不使用cascade进行保存更为简洁。不幸的是,除了调用Refresh来获取实体更改之外,没有其他方法。除非有我不知道的秘密魔法。谢谢,很高兴知道这是预期的功能。如果没有其他人响应,我将在幕后使用刷新调用来隐藏测试中的细微差别。我希望NHibernate会认识到已经添加了一个子项,并且需要刷新缓存的父项/必须将新的子项添加到子项列表中。看起来我需要手动刷新此文件