NHibernate: «коллекция не была обработана методом flush ()», вызванная проблемой отложенной загрузки - PullRequest
10 голосов
/ 06 июля 2010

У меня есть два класса:

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()

Если я вызываю Child свойство existingParent для загрузки, просто перейдя к нему:

var x = existingParent.Child.Name

проблема исчезает. Почему это происходит, и как мне это решить - желательно без необходимости менять мою стратегию получения?

** Редактировать: ** Родитель имеет FK для ребенка

Я использую NH 2.1.2.4000

Спасибо

Ответы [ 3 ]

2 голосов
/ 03 февраля 2013

У меня была похожая проблема, комментарий @Jamie Ide помог мне понять, в чем проблема. Я инициализировал коллекцию внутри конструктора, что заставило NHibernate думать, что коллекция была грязной, даже если в тот момент не требовалось сохранять этот конкретный объект.

Исключение, которое я получил, было: ClassName: ОШИБКА | NHibernate.AssertionFailure: коллекция [CollectionName] не была обработана flush ()

Я все еще хочу выполнить эту инициализацию, но, думаю, мне нужно найти другое решение этой проблемы.

0 голосов
/ 06 июля 2010

Вы можете использовать session.Load для ссылки на существующий экземпляр Child, не совершая поездки в БД. Это должно сделать это, я думаю:

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

Но убедитесь, что вызов .Id не вызывает отключение дБ.

0 голосов
/ 06 июля 2010

Что такое каскадная настройка для каскадных изменений из Child в коллекцию GrandChildren? Я думаю, что NHibernate выдает это исключение, если коллекция грязная, но настройка каскада не приводит к сохранению изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...