запрос nhibernate с дочерними объектами и lazy = "false" - PullRequest
1 голос
/ 18 сентября 2009

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

У меня есть родительский объект с коллекцией дочерних объектов IList.

Если я запускаю следующий код, используя linq для nhibernate: IList родителей = _repository.ToList ();

Я получаю SQL-операторы вроде следующего:

SELECT * FROM Parent
SELECT * FROM Child WHERE ParentId = 1
SELECT * FROM Child WHERE ParentId = 2
SELECT * FROM Child WHERE ParentId = 3
SELECT * FROM Child WHERE ParentId = 4
etc etc

Это, очевидно, крайне неэффективно, и предполагается, что это должно быть как-то связано с файлами сопоставления?

Ниже приведено сопоставление для коллекции Child:

<bag name="Children" lazy="false" table="Child" cascade="all-delete-orphan">
  <key column="ParentId"/>
  <one-to-many class="Child" />
</bag>

Поверьте, это где-то ошибка новичка.

Любая помощь очень признателен.

S

Ответы [ 2 ]

0 голосов
/ 30 октября 2009

Посмотрите на это Linq для NHibernate и выборочный режим активной загрузки . Вы можете управлять своей стратегией выборки в файле отображения, если ваша подколлекция всегда должна быть в контексте. Однако передовая практика NH рекомендует против этого. Вместо этого мы всегда сохраняем коллекции ленивыми и, при необходимости, устанавливаем стратегии выборки для запросов.

0 голосов
/ 18 сентября 2009

Все зависит от того, что _repository.ToList () делает под прикрытием. Вы можете принудительно извлекать свои коллекции с помощью синтаксиса HQL, подобного следующему:

"from Parent inner join fetch Children"

Операторы HQL предназначены для гибкости, и поэтому они, как правило, игнорируют стратегии сопоставления коллекций и стратегии объединения, определенные либо в свободном доступе, либо в файлах hbm xml.

Теперь вы должны видеть только один запрос к базе данных.

...