NHibernate:由于延迟加载问题导致“flush()”没有处理“集合”

时间:2010-07-06 16:58:55

标签: nhibernate

我有两个班级:

class Parent
{
    public virtual Child Child { get; set; }
}

class Child 
{
    public virtual IList<GrandChild> GrandChildren { get; set; }
}

我有ParentISession加载的实例,Parent.Child是延迟加载的(此时未加载)。 Child.GrandChildren也懒得加载。

如果我这样做:

session.Save(new Parent { Child = existingParent.Child } );

我得到collection [Child.GrandChildren] was not processed by flush()

如果我要加载existingParent的{​​{1}}属性,只需访问它即可:

Child
问题消失了。为什么会发生这种情况,我该如何解决它 - 最好不必更改我的提取策略?

**编辑:**父母有一个FK到孩子

我正在使用NH 2.1.2.4000

由于

3 个答案:

答案 0 :(得分:2)

我有类似的问题,来自@Jamie Ide的评论让我意识到问题所在。我正在构造函数中初始化集合,这使得NHibernate认为集合很脏,即使在那时不需要保存该特定对象。

我得到的例外是: ClassName:ERROR | NHibernate.AssertionFailure:集合[CollectionName]未由flush()

处理

我仍然想要进行初始化,但我想我必须找到解决该问题的其他方法。

答案 1 :(得分:0)

从Child到GrandChildren集合的级联更改的级联设置是什么?我认为如果集合很脏,NHibernate会抛出此异常,但级联设置不会导致更改被保留。

答案 2 :(得分:0)

您可以使用session.Load来引用Child的现有实例,而无需访问数据库。应该这样做,我想:

session.Save(new Parent { Child = session.Load(existingParent.Child.Id) } );

但请检查以确保.Id调用不会触发db旅行。