NHibernate не волшебство. Это всего лишь ORM, если ваши дети не имеют своей ссылки на родителя, почему он предполагает, что, поскольку у родителя есть список детей, на которые ссылаются дети, в свою очередь, ДОЛЖНА быть ссылка на родителя?
Я полагаю, что вы ответили на свой вопрос, когда заявили, что у дочерних сущностей не заполняется свойство Parent (что означает, что оно имеет значение null, что означает, что NHibernate будет пытаться сохранить нулевое значение для идентификатора Parent ваш детский стол).
Если бы вы использовали эти объекты БЕЗ NHibernate, имело бы смысл установить родительскую ссылку на дочерние объекты при их добавлении.
РЕДАКТИРОВАТЬ: Это для случая, когда вы указали 'Inverse' на вашем отображении. Если вы удалите этот вызов для 'Inverse,' , он должен работать так, как вы хотели, чтобы он работал, так как Inverse указывает, что другой конец (дочерний лицо) несет ответственность за отслеживание отношений. Это означает, что вам нужно вручную установить ссылку родителя на ребенка.
Однако удаление оператора Inverse приведет к сохранению дочернего элемента (ren), родительского элемента, а затем к родительскому идентификатору дочернего элемента (ren), который будет ОБНОВЛЕН. Поскольку у вас есть нулевое ограничение для родительского идентификатора, это означает, что он все равно не будет работать, так как он изначально вставит дочерний элемент с родительским идентификатором, равным нулю.
Два решения будут заключаться в том, чтобы либо удалить это ограничение, либо просто добавить в родительский метод метод с именем 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);
}
}
Затем просто используйте эти методы для добавления / удаления потомков.