Не закрывайте сеанс, пока не закончите работу с объектом.
Это одна из самых больших проблем работы с NHIbernate IMHO: определение границ сессии.
В приложении ASP.NET это довольно просто: сеанс начинается в начале запроса, и вы можете закрыть сеанс в конце запроса.
В приложении WinForms это немного сложнее: вам нужно четко определить границы, когда сеанс начинается и когда сеанс закрывается.
В приложениях WinForms я обычно определяю «Задачи», которые представляют какую-то единицу работы. Каждое задание имеет сессию. Сессия создается / открывается при создании Задачи и закрывается при ее завершении.
Кроме того, вы также можете определить некоторые ассоциации как не ленивые. Тем не менее, вы должны убедиться, что на производительность это не повлияет.