#nhibernate #fluent-nhibernate #reference #mapping
#nhibernate #свободно-nhibernate #ссылка #сопоставление
Вопрос:
У меня проблема с подобной ситуацией:
public class Foo
{
public Foo()
{
Bars = new List<Bar>();
AddBar(new Bar(this));
}
public IList<Bar> Bars {get;private set;}
public Bar LastBar {get;private set;}
public void AddBar(Bar bar)
{
Bars.Add(bar);
LastBar = bar;
}
}
public class Bar
{
public Bar(Foo foo)
{
BelongsToFoo = foo;
}
public Foo BelongsToFoo {get;private set;}
//...
}
Когда я делаю это:
var f = new Foo();
Repository.Save<Foo>(f); // -> exception - BelongsToFoo is null
Когда я удаляю последнюю строку обновления
LastBar = bar;
и установлено значение nullable, все работает нормально, но LastBar, конечно, равен null. Я хочу, чтобы последняя строка была правильно назначена и сохранена.
Как я должен правильно сопоставить эти сущности?
Правка 1
Это происходило только при создании новых объектов. Когда я обновляю Foo и добавляю новые столбцы, все работает нормально.
Ответ №1:
Убедитесь, что вы сопоставили список и ссылку «многие к одному» с одним и тем же столбцом и сделали список обратным.
Удалите ограничение not-null из свойства BelongsToFoo. Иногда NH требуется сохранить запись с нулевыми ссылками и обновить ее позже, когда будут получены идентификаторы объектов, на которые даны ссылки. Это происходит чаще при использовании генератора идентификаторов.
Комментарии:
1. К сожалению, я делаю это. : (
2. Я всегда использую HiLo и не имею ограничения not-null для свойства BelongsToFoo . 🙁
Ответ №2:
Я нашел свою проблему и решение.
Я использую http://nhforge.org/blogs/nhibernate/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx для отслеживания последней даты и информации об изменении пользователя.
В моем случае NHibernate необходимо выполнить:
- вставить Foo
- вставить строку
- обновить Foo.Последняя строка (внешний ключ)
При.1. NHibernate вызывает OnPreInsert, но при.3. вызывает OnPreUpdate для той же сущности, но сохраняет недостающую информацию о свойствах createdAt, CreatedBy.
Я изменил OnPreUpdate, чтобы скопировать эти два значения явно из объекта entity.
PS
Я знаю, что исключение странное и не соответствует данной ситуации.