Изменение начального поведения LazyLoad в NHibernate

Я только что начал использовать NHibernate и fluent-NHibernate, которые, как мне кажется, великолепны. Я настраивал все мои сопоставления для использования LazyLoading для любых отношений между классами, потому что, как правило, я считаю, что не обязательно загружать все заранее. Однако иногда вы знаете, что 100% вы будете загружать все отношения или хотя бы одно отношение, и оно сохранит дополнительные соединения, если вы получите данные вперед.

В любом случае вы можете сообщить NHibernate о загрузке данных отношений для отношения и переопределить начальную настройку?

Я использовал LinqToSql раньше, для этого я бы создал репозитории, у которых была бы перегрузка того, что элементы должны загружать, в каких отношениях, когда это необходимо. Это работало очень хорошо, поэтому мне хотелось бы что-то подобное для NHibernate.

2 ответа

Я нашел, что это может использоваться функция загрузки LazyLoading/Eager для запросов NHibernate.

Создайте свою ICriteria в обычном порядке, а затем имя ассоциации (свойство отношения, для меня - цены), а затем тип выборки, который может быть объединен, выбрать, lazyload, нетерпеливо

.SetFetchMode("Prices", FetchMode.Join)


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

Если у вас есть класс Building, у которого есть свойство, возвращающее объект Address, и эта связь будет ленивой, вы можете иметь HQL, похожий на:

string hql = "from Building bld where bld.Type.Id = 1";

При использовании свойства Address для каждого здания будет выполнен другой оператор SQL. Изменение HQL на следующее приведет к извлечению адресов как части исходного оператора SQL:

string hql = "from Building bld left outer join fetch bld.Address as addr where bld.Type.Id = 1";

licensed under cc by-sa 3.0 with attribution.