Запретить Fluent NHibernate выбрать n + 1

У меня довольно глубокий граф объектов (5-6 узлов), и пока я просматриваю его части, NHProf сообщает мне, что у меня есть проблема «Выбрать N + 1» (что я и делаю).

Я знаю два решения:

  1. Жадные дети нагрузки
  2. Разбейте мой объектный граф (и нетерпеливую нагрузку)

Я действительно не хочу делать ни то, ни другое (хотя я могу разбить график позже, поскольку предвижу, что он будет расти)

Теперь....

Можно ли указать NHibernate (с помощью FluentNHibernate), что всякий раз, когда я пытаюсь получить доступ к дочерним элементам, загружать их всех за один раз вместо select-n + 1-ing, когда я перебираю их?

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

Каждая дочерняя коллекция (на всем графике) будет иметь только около 20 членов, но 20 ^ 5 - это много, поэтому я не хочу загружать все, когда получаю корень, а просто получаю всю дочернюю коллекцию всякий раз, когда я подойти к нему.

Изменить: запоздалая мысль .... что, если я хочу ввести разбиение на страницы, когда я хочу отображать детей? Должен ли я сломать здесь свой объектный граф, или есть какая-то хитрость, которую я могу использовать для решения всех этих проблем?

Ответов (2)

Решение

Мне кажется, что вы хотите продолжить подход к использованию своей модели предметной области, а не создавать конкретный запрос nhibernate для обработки этого сценария. Учитывая это, я бы посоветовал вам взглянуть на атрибут размера партии, который вы можете применить к своим коллекциям. Свободный интерфейс Fluent NHibernate еще не поддерживает этот атрибут, но в качестве обходного пути вы можете использовать:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")

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

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

Документация по производительности NHibernate объяснит, как работает размер пакета.

Изменить: я не знаю, как перейти на страницу из вашей модели домена. Я рекомендую вам писать NH-запросы для сценариев, в которых требуется разбиение на страницы.

Изменить: запоздалая мысль .... что, если я хочу ввести разбиение на страницы, когда я хочу рендерить детей? Я ДОЛЖЕН сломать здесь свой граф объектов, или есть какая-то хитрость, которую я могу использовать для решения всех этих проблем?

Что ж, если вы загружаете только детей, вы можете их перелистывать :). Но если вам нужно что-то вроде: LoadParent И PageChildren, то я не думаю, что вы сможете это сделать.