Как реализовать сущности с ассоциацией «многие ко многим», чтобы иметь возможность сохранять корневой объект с помощью NHibernate? - PullRequest
1 голос
/ 25 мая 2011

У меня есть две сущности:

    public class Group
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }

        private ICollection<Item> _items = new HashSet<Item>();
        public virtual ICollection<Item> Items
        {
            get { return _items; }
            set { _items = value; }
        }
    }

    public class Item
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
    }

Я использую автоподстановку со следующим переопределением:

automapping.Override<Group>(m => m.HasManyToMany(_ => _.Items).AsSet());

Я создаю объект группы и несколько элементов, добавляя их в объект группы. Когда я сохраняю объект группы, используя session.Save(group), возникает исключение:

NHibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом. Тип: NhResearch.ManyToManyTests + Item, Объект: 0 item1 в NHibernate.Engine.ForeignKeys.GetEntityIdentifierIfNotUnsaved (String entityName, объектный объект, сеанс ISessionImplementor)

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 25 мая 2011

Вам не хватает настройки каскада.

m => m.HasManyToMany(_ => _.Items).AsSet().Cascade.AllDeleteOrphan()

Все - если вы хотите сохранить обновление и удалить элементы

AllDeleteOrphan - то же самое, что и все, но также удаляет потерянные элементы

SaveUpdate - каскад при сохранении или обновлении

Удалить - каскадировать только удаленные элементы

К вашему сведению, вам также, вероятно, не хватает спецификации таблицы и столбцов родительского и дочернего ключей.

...