У меня есть два класса:
class Parent
{
public virtual Child Child { get; set; }
}
class Child
{
public virtual IList<GrandChild> GrandChildren { get; set; }
}
У меня есть экземпляр Parent
загруженный из моего ISession
, Parent.Child
ленив загруженный (НЕ загруженный в этой точке). Ребенок. GrandChildren также ленив загруженный.
Если я делаю это:
session.Save(new Parent { Child = existingParent.Child } );
Я добираюсь collection [Child.GrandChildren] was not processed by flush()
Если я вызываю existingParent
Child
свойство, которое будет загружено, просто путем доступа к нему:
var x = existingParent.Child.Name
проблема уходит. Почему это происходит, и как я решаю его - предпочтительно, не имея необходимость изменять мою выбирающую стратегию?
** Редактирование: ** Родитель имеет FK Ребенку
Я использую NH 2.1.2.4000
Спасибо
Какова настройка каскада для каскадирования изменений от Child к коллекции GrandChildren? Я думаю, что NHibernate выбрасывает это исключение, если коллекция грязная, но настройка каскада не приводит к сохранению изменений.
Вы можете использовать session.Load
для ссылки на существующий экземпляр Child
без обращения к базе данных. Думаю, это должно сработать:
session.Save(new Parent { Child = session.Load(existingParent.Child.Id) } );
Но проверьте, чтобы вызов .Id
не вызвал обращение к БД.