2012-01-27 43 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

相关问题