Ссылка NHibernate назад - hasmany и ссылка на одну и ту же сущность - PullRequest
1 голос
/ 06 апреля 2011

У меня проблема с такой ситуацией:

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

LastBar = bar;

и установить в nullable все работает нормально, но LastBar, конечно, нулевой. Я хочу, чтобы последний Бар был правильно назначен и сохранен.

Как мне правильно отобразить эти объекты?

Редактировать 1
Это происходит только при создании новых объектов. Когда я обновляю Foo и добавляю новые бары, все работает нормально.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2011

Я нашел свою проблему и решение.

Я использую http://nhforge.org/blogs/nhibernate/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx для отслеживания последней даты и информации об изменении пользователя.

В моем случае NHibernate нужно сделать:

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

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

Я изменил OnPreUpdate для копирования этих двух значений, явных из объекта-сущности.

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

0 голосов
/ 06 апреля 2011

Убедитесь, что вы отображаете список и ссылку «многие к одному» на один и тот же столбец и делаете список обратным.

Удалите ограничение not-null из свойства BelongsToFoo.NH иногда нужно хранить запись с нулевыми ссылками и обновлять ее позже, когда будут получены идентификаторы ссылочных объектов.Это происходит чаще при использовании генератора идентичности.

...