Перехватывает ли поведение NHibernate Lazy-Load возврат нулевого значения, если он не подключен к сеансу? - PullRequest
4 голосов
/ 06 сентября 2011

Кажется, это должно быть очевидным, но я искал ответ часами, но безуспешно.

Я использую NHibernate для сохранения доменной модели с сервисным уровнем, который обслуживает внешний интерфейс ASP.NET MVC («сервисный уровень» в настоящее время является просто стандартной библиотекой классов, но может быть преобразован в WCF в будущем) , Веб-приложение запрашивает данные, которые оно хочет, и указывает коллекции в нужном ему доменном объекте, сервисный уровень принимает запрос, загружает объект и требуемые коллекции (используя отложенную загрузку) и передает объект туда, где он преобразуется с помощью AutoMapper. в представлении, дружественном представлению модели.

Что я хочу сделать, это загрузить необходимые коллекции, отсоединить объект от сеанса и передать его внешнему интерфейсу. Однако, когда AutoMapper пытается отобразить объект, это вызывает исключение, потому что он пытается получить доступ к коллекциям, которые не были инициализированы, и сеанс больше не доступен. Я могу оставить объект подключенным, но в этом случае преобразование AutoMapper приводит к тому, что все свойства объекта все равно загружаются с отложенной загрузкой, и это не будет возможным, если мы пойдем по маршруту WCF.

Что я хочу сделать, так это изменить это поведение, чтобы вместо генерации исключения коллекция возвращала ноль (или, что еще лучше, пусто), когда она не подключена к сеансу. Это было поведение по умолчанию в Entity Framework V1 (который, по общему признанию, не выполнял автоматическую загрузку), с которым я работал ранее, но я не могу найти способ сделать это в NH.

Есть идеи? Я здесь не на том пути?

РЕДАКТИРОВАТЬ - чтобы быть немного яснее в том, что я пытаюсь достичь, при доступе к свойству коллекции я хочу следующее:

Подключено к сеансу: сбор отложенной загрузки как обычно.
Нет сеанса: свойство имеет значение null (а не выбрасывать исключение)

ОБНОВЛЕНИЕ - Следуя этой записи Билли МакКафферти, мне удалось реализовать решение с использованием IUserCollectionType, которое, кажется, работает до сих пор. Вместо того, чтобы использовать предоставленный PersistentGenericBag, как он делает, мне пришлось создавать новые типы, которые изменили поведение, когда они не подключены к сеансу. Он не идеален и требует некоторых очень уродливых сопоставлений, но по крайней мере мне не нужно трогать мои доменные объекты или сопоставления клиентов, чтобы заставить его работать.

1 Ответ

1 голос
/ 30 августа 2012

Наиболее подходящим решением в этом случае, вероятно, является проверка в AutoMapper полей с отложенной загрузкой, действительно ли они были загружены с помощью NHibernateUtil.IsInitialized ().Не уверен, как / если возможно заставить Automapper использовать эту проверку для всех неявных отображений свойств.

Старый вопрос, но это то, что мы сделали, чтобы решить ту же проблему, надеюсь, это поможет вам установить правильный путь, если кто-тонатыкается на эту проблему.

...