NHibernate неуникальная дочерняя коллекция для быстрой загрузки (один ко многим или много ко многим) - PullRequest
1 голос
/ 09 февраля 2012
  • когда я использую отношения один-ко-многим, я получаю:

    коллекция не связана ни с одним сеансом

    ошибки призагружаю с нетерпением и не получаю детей, если загружаю лениво.

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

Схема данных выглядит следующим образом:

Элемент:

  • int ID (PK)
  • имя строки
  • int StorageId(Хранение FK, неуникальное использование)

Хранение (игнорируется в отображении):

  • int ID (PK)
    • имя строки

TransporterToStorage (содержит информацию, а не только таблицу ссылок):

  • int ID (PK)
    • int StorageId (FK Storage)
    • int TransporterId (FK Transporter)
    • строка TransportLineName

Transporter (игнорируется в mapping):

  • int ID (PK)
    • Имя строки

Элемент должен быть представлен C #/ NHibernate класс, с дополнительным свойством коллекции TransportersToStorage, содержащим 0-n записей.Из-за соображений производительности я хочу сопоставить только Item.StorageId с TransporterToStorage.StorageId и игнорировать таблицу Storage, которая содержит первичный ключ для обоих.

<bag name="TransportersToStorages" ... >
<key property-ref="StorageId" unique="false" ... />
<one-to-many class="TransporterToStorage" column="StorageId" ... />
</bag>

Кажется, один-ко-многимнарушать некоторые правила NHibernate, потому что равные TransporterToStorage записи могут принадлежать нескольким элементам.Вероятно, это является причиной того, что коллекция

не связана ни с одним сеансом

Ошибка при активной загрузке.

Конкретный запрос похож на (быстрый псевдо-HQL, но на самом деле выполняется с помощью критериев):

select Item inner join fetch TransporterToStorage tts 
where tts.TransporterId = :p1 and tts.StorageId in (:p2, :p3, :p4)

Может ли быть сопоставление «многие ко многим» или подобное, только с одним соединением в SQL, отправленном в базу данных?

Что лучше всего сопоставить это?

Дочерняя коллекция загружается по умолчанию лениво (то есть, совсем не загружается), а в данном случае охотно.

1 Ответ

0 голосов
/ 09 февраля 2012

Я подозреваю, что проблема управления сеансом здесь, я подозреваю, что ваш сеанс закрыт, ДО того, как вы получите доступ к своим ленивым / нетерпеливо загруженным детям.Возможно, вам придется изменить способ управления вашими сессиями или загрузить родителей / детей в DTO и вернуть это из вашего метода.

Не зная больше о том, как вы обрабатываете сессии, более точный ответ затруднен.

...