Обратная ссылка NHibernate — множество и ссылка на ту же сущность

#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 необходимо выполнить:

  1. вставить Foo
  2. вставить строку
  3. обновить Foo.Последняя строка (внешний ключ)

При.1. NHibernate вызывает OnPreInsert, но при.3. вызывает OnPreUpdate для той же сущности, но сохраняет недостающую информацию о свойствах createdAt, CreatedBy.

Я изменил OnPreUpdate, чтобы скопировать эти два значения явно из объекта entity.

PS
Я знаю, что исключение странное и не соответствует данной ситуации.