NHibernate ленивая загрузка, но нет виртуальных свойств? - PullRequest
1 голос
/ 07 февраля 2012

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

Ни одно из моих свойств во всей модели не помечено как виртуальное, потому что я не хочу ленивой загрузки. Я сопоставляю по коду и в каждом сопоставлении классов я устанавливаю Lazy(false);

Однако, когда дело доходит до сопоставления коллекций, если я пытаюсь получить доступ к коллекции после завершения сеанса, я получаю сообщение об ошибке "failed to lazily initialize a collection of role...".

Я должен явно установить collectionMapping.Lazy(CollectionLazy.NoLazy);, прежде чем он будет загружать коллекцию. Насколько я понимаю, ленивая загрузка была невозможна, если ваши свойства в вашей модели не были определены в виртуалах?

Я что-то упустил?

Ответы [ 3 ]

7 голосов
/ 07 февраля 2012

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

2 голосов
/ 08 февраля 2012

Виртуальные свойства и методы нужны только для ленивых ассоциаций (многие-к-одному или один-к-одному), потому что NHibnerate должен установить прокси сущность для свойства ассоциации.

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

1 голос
/ 07 февраля 2012

Вам все еще нужно использовать IList<T> вместо List<T>, потому что NH нуждается в собственной реализации коллекции.

Обратите внимание:

  • Вы не будете слишком далеко ходить всложная модель без отложенной загрузки, за исключением того, что ваша база данных помещается в ОЗУ или вы не против разрезать свою ОО-модель на части, что снижает как удобство обслуживания, так и производительность.
  • При использовании интерфейсов вы можете иметь сущности без виртуальных членовсоздавать прокси из.Однако эти интерфейсы следует использовать только для ссылки на объекты, поскольку они всегда могут быть прокси.
...