Я, вероятно, здесь делаю ошибку новичка, но я не могу понять, как сделать эту работу. У меня есть две сущности - Parent
и Child
, где одна Parent
может иметь много Child
ren. Кажется, проблема в том, что когда я добавляю нового потомка к родителю, родитель не может каскадно сохранить дочернего, потому что у дочернего экземпляра еще нет идентификатора. С другой стороны, ребенок не может быть сохранен самостоятельно, поэтому у него нет возможности получить удостоверение личности ...
Мои отображения:
public ParentMap()
{
// ID and other properties
HasMany(p => p.Children).Cascade.AllDeleteOrphan().Not.LazyLoad();
}
public ChildMap()
{
// ID and other properties
References(c => c.Parent);
}
Теперь, возможно, у меня уже есть родительская запись в моей базе данных, и я хочу добавить дочерний элемент в свою коллекцию дочерних элементов. Для этого я создаю новый экземпляр класса Child
, добавляю дочерний элемент к свойству Children
родителя (типа IList<Child>
). Я также извлекаю родительскую запись и устанавливаю свойство childs Parent
для родительского объекта.
Когда я пытаюсь сохранить это, я получаю ошибки независимо от того, в каком порядке я пытаюсь это сделать.
С Save(p)
, сохраняя родительскую запись и надеясь, что ребенок будет сохранен на каскаде, я получаю следующую ошибку:
Невозможно вставить значение NULL в столбец 'ChildID', таблица 'dbo.Children'; столбец не допускает нулевые значения. Вставить не удается. Заявление было прекращено.
Если я попробую наоборот, то есть сначала сохраню дочерний элемент, затем добавлю его к родительскому элементу и сохраню родительский, я получу следующую ошибку:
нулевой идентификатор в записи Application.Domain.Entities.Child (не очищать сеанс после возникновения исключения)
В каком порядке я должен позвонить parent.Children.Add(child)
, child.Parent = parent
, session.Save(parent)
и session.Save(child)
, чтобы сделать эту работу? Чего-то не хватает в моей конфигурации сопоставления?
Обновление: Я добавил .Inverse()
и безуспешно пробовал следующее:
// First of the above errors
session.Save(child);
child.Parent = parent;
parent.Children.Add(child);
session.Save(parent);
// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(child);
session.Save(parent);
// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(parent);
// Second of the above errors
child.Parent = parent;
parent.Children.Add(child);
session.Save(child);