NHibernate: Добавление объекта к ленивому загрузило many-many отношения

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

Как мы добавляем новый объект, не загружая целый набор (количество является большим)?

6
задан JontyMC 18 February 2010 в 14:23
поделиться

3 ответа

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

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

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

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

0
ответ дан 17 December 2019 в 20:31
поделиться

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

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

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

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

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

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

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

1
ответ дан 17 December 2019 в 20:31
поделиться

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

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

1
ответ дан 17 December 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: