Почему все открытые методы в классе сущности объявляются как виртуальные при использовании с NHibernate? - PullRequest
1 голос
/ 04 февраля 2010

Почему методы класса сущностей объявляются как общедоступные виртуальные, когда класс должен отображаться в таблицу с использованием NHibernate.

Может ли ответ, что NHibernate сможет переопределить эти методы во время выполнения?*

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Да. NHibernate вернет прокси для вашего объекта. В простейшем случае, он будет полностью неинициализирован и просто знает его тип и идентификатор. Таким образом, NHibernate должен будет перехватить вызовы метода для объекта и инициализировать его до вызова тела сообщения.

2 голосов
/ 04 февраля 2010

NHibernate требует этого по умолчанию, потому что он генерирует прокси для вашего класса, чтобы поддерживать отложенную загрузку объекта (не путать с отложенной загрузкой связанных объектов или коллекций).При загрузке объекта из БД с использованием метода ISession.Load NHibernate NHibernate возвращает прокси для этого объекта, что означает, что он возвращает пустой объект, где установлен только первичный ключ (идентификатор).Значения других свойств извлекаются только после прочтения свойства.

Однако вы можете отключить это поведение.В своем отображении NHibernate вы можете указать, что NHibernate не должен использовать динамические прокси для сущности.Это довольно просто сделать, вам просто нужно указать lazy = "false" в отображении класса:

MyEntity.hbm.xml:

<class name="MyEntity" table="MyTable" lazy="false">
</class>

При этом вам не нужно объявлять виртуальные свойства или методы.В основном я делаю это так, поскольку я не хочу объявлять свойства или методы как виртуальные, если моя модель предметной области не требует этого.Я могу жить с -imho- минимальным ударом по производительности без использования динамических прокси.

1 голос
/ 04 февраля 2010

NHibernate требует, чтобы свойства были виртуальными, чтобы поддерживать отложенную загрузку через прокси-классы.

...