Можно ли включить / отключить отложенную загрузку для всех объектов в сеансе NHibernate? - PullRequest
4 голосов
/ 16 декабря 2009

По умолчанию, NHibernate lazy загружает все коллекции, что в большинстве случаев работает нормально. Однако я сталкиваюсь с проблемами с некоторыми инструментами, которые используют отражение, которое не очень хорошо работает с объектами прокси. В этом случае я не могу сериализовать сущность, используя JSON.NET, потому что она генерирует исключение при попадании в прокси-объект.

У меня вопрос: есть ли способ сказать сеансу, чтобы отключить отложенную загрузку для ВСЕХ сущностей на время существования этого сеанса? Я знаю, что вы можете сделать это для определенного типа, но я хочу иметь возможность сделать это для всех сущностей.

Ответы [ 3 ]

3 голосов
/ 16 декабря 2009

Вы можете использовать sessionFactory.OpenStatelessSession(), и вы получите экземпляр IStatelessSession, который не использует отложенную загрузку.

Имейте в виду, что IStatelessSession имеет упрощенную модель, которая не отслеживает изменения. Это кажется подходящим для вашего случая использования.

0 голосов
/ 16 декабря 2009

Если вы не хотите использовать сеанс без сохранения состояния по какой-либо причине, вы можете получить запрос в вашем запросе.

Критерий:
.SetFetchMode ("ClassName", FetchMode.Eager)

HQL :

string hql = "from Order o" +
             " inner join fetch o.OrderLines" +
             " inner join fetch o.Customer" +
             " where o.Id=:id";
0 голосов
/ 16 декабря 2009

Я считаю, что это невозможно, так как классы и свойства становятся ленивыми (из-за конфигурации - XML ​​или Fluent), когда ISessionFactory собирается, и это происходит только один раз в начале жизненного цикла приложения. Именно здесь создаются фактические прокси-классы, которые используются для обеспечения отложенной загрузки.

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

Type t = entity.GetType().BaseType;

"сущность" - это ваша сущность, которая выступает в качестве прокси.

Более того, вы можете вместо этого использовать DTO для сериализации с JSON.NET вместо реальных сущностей, используя для этого объект-сопоставитель объектов, такой как AutoMapper.

...