Можно ли выборочно отключить ленивую загрузку с NHibernate? - PullRequest
7 голосов
/ 03 декабря 2010

С LINQ to Sql вы можете указать, для данной выборки, что вы не хотите загружать определенные дочерние элементы (с нетерпением или ленивостью).Возможно ли это в NHibernate?Бывают моменты, когда мне просто нужен корневой объект и / или только часть графа объектов, и я хотел бы иметь возможность указать это вместо того, чтобы писать DTO и выполнять сопоставление, чтобы обойти тот факт, что NHibernate чувствуетвынужден загрузить все, если я попытаюсь сериализовать мой объект.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 03 декабря 2010

Да, но ...

Уровень вашей гибкости может зависеть от вашей версии NHibernate и от того, как вы строите свой запрос.Например, запрос LINQ (в этом случае управление версиями может иметь значение) не даст вам такой же гибкости, как запрос ICriteria или HQL.

С API критериев вы можете вызвать .SetFetchMode(), передавая свойство и требуемый режим для этого запроса.

NHibernate также позволяет создавать проекции, поэтому вы можете создавать экземпляры объектов несопоставленных типов или DTO без сопоставления.Конечно, проекция идет только в одну сторону;если он не нанесен на карту, он не может быть сохранен.

3 голосов
/ 03 декабря 2010

Все, что уже сказал Джей, плюс вы можете указать лень в ваших файлах сопоставления ... Вы можете указать это на уровне класса:

<class name="Foo" lazy="true">
  <!-- additional data -->

Или на уровне свойства / коллекции:

<property Name="Bar" lazy="true"/>
<set Name="Bars" lazy="true"> <-- makes the collection lazy
<set Name="Bars" fetch="join"> <-- eagerly fetches child items in the collection
<set Name="Bars" fetch="select"> <-- fetches items via another select when the collection is accessed for the first time

Эти значения по умолчанию могут быть переопределены для определенных запросов и игнорируются HQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...