Кажется, это должно быть очевидным, но я искал ответ часами, но безуспешно.
Я использую NHibernate для сохранения доменной модели с сервисным уровнем, который обслуживает внешний интерфейс ASP.NET MVC («сервисный уровень» в настоящее время является просто стандартной библиотекой классов, но может быть преобразован в WCF в будущем) , Веб-приложение запрашивает данные, которые оно хочет, и указывает коллекции в нужном ему доменном объекте, сервисный уровень принимает запрос, загружает объект и требуемые коллекции (используя отложенную загрузку) и передает объект туда, где он преобразуется с помощью AutoMapper. в представлении, дружественном представлению модели.
Что я хочу сделать, это загрузить необходимые коллекции, отсоединить объект от сеанса и передать его внешнему интерфейсу. Однако, когда AutoMapper пытается отобразить объект, это вызывает исключение, потому что он пытается получить доступ к коллекциям, которые не были инициализированы, и сеанс больше не доступен. Я могу оставить объект подключенным, но в этом случае преобразование AutoMapper приводит к тому, что все свойства объекта все равно загружаются с отложенной загрузкой, и это не будет возможным, если мы пойдем по маршруту WCF.
Что я хочу сделать, так это изменить это поведение, чтобы вместо генерации исключения коллекция возвращала ноль (или, что еще лучше, пусто), когда она не подключена к сеансу. Это было поведение по умолчанию в Entity Framework V1 (который, по общему признанию, не выполнял автоматическую загрузку), с которым я работал ранее, но я не могу найти способ сделать это в NH.
Есть идеи? Я здесь не на том пути?
РЕДАКТИРОВАТЬ - чтобы быть немного яснее в том, что я пытаюсь достичь, при доступе к свойству коллекции я хочу следующее:
Подключено к сеансу: сбор отложенной загрузки как обычно.
Нет сеанса: свойство имеет значение null (а не выбрасывать исключение)
ОБНОВЛЕНИЕ - Следуя этой записи Билли МакКафферти, мне удалось реализовать решение с использованием IUserCollectionType, которое, кажется, работает до сих пор. Вместо того, чтобы использовать предоставленный PersistentGenericBag, как он делает, мне пришлось создавать новые типы, которые изменили поведение, когда они не подключены к сеансу. Он не идеален и требует некоторых очень уродливых сопоставлений, но по крайней мере мне не нужно трогать мои доменные объекты или сопоставления клиентов, чтобы заставить его работать.