NHibernate требует этого по умолчанию, потому что он генерирует прокси для вашего класса, чтобы поддерживать отложенную загрузку объекта (не путать с отложенной загрузкой связанных объектов или коллекций).При загрузке объекта из БД с использованием метода ISession.Load NHibernate NHibernate возвращает прокси для этого объекта, что означает, что он возвращает пустой объект, где установлен только первичный ключ (идентификатор).Значения других свойств извлекаются только после прочтения свойства.
Однако вы можете отключить это поведение.В своем отображении NHibernate вы можете указать, что NHibernate не должен использовать динамические прокси для сущности.Это довольно просто сделать, вам просто нужно указать lazy = "false" в отображении класса:
MyEntity.hbm.xml:
<class name="MyEntity" table="MyTable" lazy="false">
</class>
При этом вам не нужно объявлять виртуальные свойства или методы.В основном я делаю это так, поскольку я не хочу объявлять свойства или методы как виртуальные, если моя модель предметной области не требует этого.Я могу жить с -imho- минимальным ударом по производительности без использования динамических прокси.