Краткий ответ: хотя вам (как и мне) может быть больно держать руку NHibernate больше, чем вы хотели, я согласен с Джеймсом Л., что нетерпеливое получение, похоже, лучший способ сделать это.
Что касается ссылок Маурисио, мы обнаружили, что передача сущностей NHibernate через WCF в любом случае работает не слишком хорошо, так как вы на самом деле не передаете объекты POCO, которые любит WCF, а передаете объекты с коллекциями, специфичными для NHibernate.
По этой причине мы успешно использовали Automapper для преобразования сущности в соответствующий DTO для передачи по проводам с WCF. Побочным эффектом этого является то, что он в основном все ленится просто потому, что собирается пересечь граф объекта, чтобы поместить его в другой объект.
Хотя это работает, я должен полностью согласиться с предупреждением Джеймса относительно проблемы выбора N + 1; В нашем веб-приложении мы обнаружили, что загрузка одной страницы может привести к сотням отдельных обращений к базе данных. Вы действительно можете вырезать огромное количество, сначала воспользовавшись энергичной выборкой с помощью HQL или Criteria.
Вы можете загружать только одну коллекцию для каждой сущности. Это ограничение SQL.
Я не уверен, что это правда, но я бы определенно рекомендовал вам загружать коллекции в отдельных запросах; Я думаю, что вы можете загрузить их все в одном запросе, но в базовом SQL они останутся внешними объединениями, что приведет к декартовому продукту, который очень легко выйдет из-под контроля.
Как обычно, Ayende Rahien уже описал все это очень хорошо уже , а также описание того, как использовать Futures, чтобы по крайней мере с относительной легкостью выполнить все эти отдельные запросы коллекции за один прием в оба конца. .