NHibernate: добавление объекта в лениво загруженное отношение «многие ко многим» - PullRequest
6 голосов
/ 18 февраля 2010

У нас есть объект с коллекцией «многие ко многим», отображенный как ленивый загруженный пакет. Когда мы загружаем объект, коллекция не загружается - отлично. Теперь мы хотим добавить новый объект в эту коллекцию. Как только мы это сделаем, коллекция будет загружена.

Как добавить новую сущность, не загружая всю коллекцию (коллекция большая)?

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

У меня была такая же проблема.

Вам просто нужно создать среднюю сущность и сделать два отношения один-ко-многим.

Если вы проверили сгенерированные им операторы для обновления отношения «многие ко многим», вы все равно не будете их использовать. Когда вы добавляете новый элемент в отношение «многие ко многим» отношения, которое было загружено в первый раз (я думаю, что это генерирует один оператор выбора), вы обновляете это отношение и делаете коммит. Это происходит:

Удаление выполняется для каждого объекта в массиве (может быть, это один оператор удаления или N операторов удаления, я не помню)

Все объекты повторно вставляются в базу данных (N операторов вставки + новый).

Если вы делаете много обновлений отношения «многие ко многим», то отображение «многие ко многим» не для вас. Вы можете использовать многие-ко-многим для объектов, которые не меняются или меняются не очень часто (из-за всех удалений и повторных вставок).

Вы должны сделать 3 объекта (скажем, Пользователь, Пост, Голосование - это средняя таблица USER_POST). Создайте первичные ключи для всех этих таблиц (даже для USER_POST). Создайте суррогатный ключ и установите ограничение для USER_ID, POST_ID, который будет уникальным для таблицы USER_POST. Сопоставьте его как нормальные отношения один-ко-многим, многие-к-одному (родитель-ребенок, ребенок-родитель) и все.

1 голос
/ 25 февраля 2010

Если вы не хотите изменять модель своего домена, вы можете выполнить SQL напрямую, чтобы обновить таблицу ссылок m-m (либо с помощью запроса Nhibernate, либо с помощью параметризованного хранимого процесса).

Также обратите внимание, что вы не сможете использовать операцию Add() (иначе NH автоматически запустит отложенную загрузку). Вместо этого рассмотрите возможность вызова метода с соответствующим именем в вашем репозитории class.

0 голосов
/ 18 февраля 2010

Причиной такого поведения является то, что вы ссылаетесь на свою коллекцию, когда добавляете () в нее новый элемент.Эта ссылка запускает ленивую загрузку.

Мне показалось, что лучше всего избегать явных сопоставлений «многие ко многим» в NHibernate.Обычно я использую две связи «один ко многим» с третьим объектом, который работает как таблица ссылок.Удостоверьтесь, что вы установили много сторон отношения в inverse = "true".Затем вы можете напрямую выполнить:

session.Save(new LinkEntity(leftSideInstanceOrProxy, rightSideInstanceOrProxy);

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

...