Я новичок в NHibernate (мой первый большой проект с ним). Я использовал простой метод доступа к данным, создав объект ISession в блоке using, чтобы получить мой объект или список объектов, и таким образом сеанс был уничтожен после выхода из блока кода.
Однако это не работает в ситуации, когда требуется отложенная загрузка. Например, если у меня есть объект Customer, у которого есть свойство, которое представляет собой коллекцию заказов, то при попытке отложенной загрузки я получаю исключение Hibernate. Кто-нибудь использует другой метод?





Держите сессию открытой для всей вашей работы. Если ваш сеанс жизни слишком мал, вы не сможете воспользоваться кешем уровня сеанса (что имеет большое значение). Каждый раз, когда вы можете предотвратить обратное обращение к базе данных, вы сэкономите много времени. Вы также не можете воспользоваться преимуществами отложенной загрузки, что очень важно понимать.
Если время жизни вашего сеанса слишком велико, вы можете столкнуться с другими проблемами.
Если это веб-приложение, вы, вероятно, справитесь с шаблоном session-per-httpRequest. По сути, это HttpModule, который открывает сеанс в начале запроса и сбрасывает / закрывает в конце. Обязательно сохраните сеанс в HttpContext.Items НЕ СТАТИЧЕСКОЙ ПЕРЕМЕННОЙ.
Вы также можете посмотреть на Носорог для реализации единицы работы.
посмотрите веб-трансляции SummerOfNHibernate, чтобы получить отличное руководство ... То, что вы ищете, не появится до веб-эпизодов 5 или 6.
Управление сеансом:
Сессия на запрос:
Просто примечание, несколько месяцев спустя. Хотя мы все еще используем вышеперечисленные подходы, по большей части люди, работающие над использованием инструмента IOC для управления ISessions и ISessionFactory, проделали более интересную работу - возможно, захотите ознакомиться с проектами StructureMap и FubuMvc для получения дополнительной информации.
@Matt: взгляните на объект Castle NHibernate, он существует уже много лет: castleproject.org/container/facilities/trunk/nhibernate/…
Ссылки в ответе кажутся устаревшими.
Поскольку вы разрабатываете веб-приложение (предположительно с использованием ASP.NET), ознакомьтесь с Лучшие практики NHibernate с ASP.NET на CodeProject.
Я видел много примеров этого метода управления сеансами для веб-приложений, но заставить его работать с winforms - совсем другое дело. Билли Маккафферти старается изо всех сил, но не дает советов, как использовать его фреймворк в winforms. В частности, когда начинать и очищать транзакцию в winforms.