Nhibernate Has Many Insert генерирует дополнительное обновление (без инверсии) - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть родительский класс с двумя списками дочерних классов

    public class Parent
    {
        ...

        public virtual ICollection<Foo> Foo{ get; set; }

        public virtual ICollection<Bae> Bar{ get; set; }
    }

    public class Foo
    {
        ...

        public virtual Parent Parent{ get; set; }
    }

    public class Bar
    {
        ...

        public virtual Parent Parent{ get; set; }
    }

Отображения

        public ParentMap()
        {
            ...

            HasMany(m => m.Foo).AsSet().Cascade.All();
            HasMany(m => m.Bar).AsSet().Cascade.All();
        }

        public FooMap()
        {
            ...

            References(m => m.Parent);
        }

        public BarMap()
        {
            ...

            References(m => m.Parent);
        }

Каждый раз, когда я сохраняю родительский объект, я получаю

INSERT Parent ...
INSERT Foo with Parent_id set to NULL
INSERT Bar with Parent_id set to NULL
UPDATE Foo set Parent_id to Parent id
UPDATE Bar set Parent_id to Parent id

Есть ли способ помимо установить отношение на Inverse, чтобы избежать дополнительного обновления?

Ответы [ 2 ]

9 голосов
/ 07 ноября 2011

Если у вас двунаправленная ассоциация, вы должны установить сторону HasMany на инверсию, это наиболее распространенный способ.

Другой возможностью является установка родительской ссылки на Not.Insert().Not.Update(), тогдародительское свойство будет полностью игнорироваться при вставке / обновлении.

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

Для второго и третьего способа вы можете дополнительно установить Not.KeyNullable() на HasMany, это гарантирует, что NHibernate вставляет новую строку с уже установленным родительским идентификатором, и избегает дополнительного оператора обновления (эта функция требует NHibernate 3.2.0).

1 голос
/ 07 ноября 2011

AFAIK, нет.Устанавливая обратное свойство, вы указываете владельца ассоциации.

Почему проблема заключается в указании обратного свойства?

...