我有两个班级:
class Parent
{
public virtual Child Child { get; set; }
}
class Child
{
public virtual IList<GrandChild> GrandChildren { get; set; }
}
我有Parent
从ISession
加载的实例,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
由于
答案 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旅行。