Вставка родительского и дочернего с NHibernate в одно и то же время

Я пытаюсь сохранить (вставить) родительский объект со списком дочерних объектов. В обоих случаях в качестве основных ключей используется Guid. Ключи не имеют значения NULL, и в db нет отношения ключей.

Сохранение не работает, исключение вызывает требование - я пытаюсь сохранить нуль в родительском внешнем ключе в таблице Child.

Я ожидал, что nhibernate создаст ключ для родителя и пусть его объекты Child узнают об этом. Является ли это ограничением NHibernate или использованием Guids в качестве первичных ключей?

Этот ответ предполагает, что вы должны установить родительский мануал, это действительно единственный способ?

Вот мои сопоставления для справки:

Родительское сопоставление:

HasMany(x => x.Children).KeyColumn("ParentKey").Inverse().Cascade.All();

Отображение ребенка:

 References(x => x.Parent).Not.Nullable().Column("ParentKey");

Ответ 1

NHibernate не волшебство. Это только ORM, если у ваших детей нет ссылки на родителя, почему бы предположить, что, поскольку у родителя есть список детей, ссылка на детей, в свою очередь, СЛЕДУЕТ быть ссылкой на родителя?

Я считаю, что вы ответили на свой собственный вопрос, когда заявили, что объекты Child не имеют своего родительского свойства (это означает, что оно равно null, что означает, что NHibernate будет пытаться сохранить значение "null" для идентификатора родителя в ваш детский стол).

Если бы вы использовали эти объекты WITHOUT NHibernate, было бы разумно, что исходная ссылка должна быть установлена ​​на дочерние объекты, когда они будут добавлены.

РЕДАКТИРОВАТЬ: Это для случая, когда вы указали "Обратная" на вашем сопоставлении. Если вы должны удалить этот вызов до "Обратный",, он должен работать так, как вы хотите, чтобы он работал как Обратный, который отвечает за другой конец (дочерний объект) для отслеживания отношений. Это означает, что вам нужно вручную установить ссылку родителя на дочерний элемент.

Однако удаление инструкции Inverse приведет к тому, что Child (ren) будет сохранен, родитель, который будет сохранен, а затем родительский идентификатор Child (ren) для ОБНОВЛЕНИЯ. Поскольку у вас есть нулевое ограничение для родительского идентификатора, это означает, что он все равно не будет работать, поскольку он первоначально вставляет дочерний элемент с родительским идентификатором null.

Два решения состоят в том, чтобы либо удалить это ограничение, либо просто добавить метод к родительскому имени AddChild:

public void AddChild(Child childObj)
{
    childObj.Parent = this;
    Children.Add(childObj);
}

Добавьте еще один метод под названием RemoveChild:

public void RemoveChild(Child childObj)
{
    if (Children.Contains(childObj))
    {
        Child.Parent = null;
        Children.Remove(childObj);
    }
}

Затем просто используйте эти методы для добавления/удаления дочерних элементов.