Каково влияние lazy = "false" на элемент класса отображения NHibernate? - PullRequest
10 голосов
/ 03 марта 2009

Я работаю с устаревшей системой, в которой я экспериментирую с добавлением NHibernate. У меня есть класс, который мне нужно сопоставить с таблицей, но в нем есть много существующих методов, которые не являются виртуальными.

Я обнаружил, что могу заставить NHibernate успешно загружать сопоставление даже при наличии не виртуальных методов, если для атрибута "lazy" в элементе класса файла сопоставления установлено значение "false". Мне интересно, как это повлияет на использование NHibernate в этом классе.

Я понимаю значение не ленивой загрузки для коллекций, которые принадлежат объекту, но мне не ясно, что означало бы ленивая или энергичная загрузка в классе. Означает ли это, что все коллекции, принадлежащие этому объекту, будут загружены? Или это означает, что NHibernate больше не использует динамический прокси вместо реального класса? Что-то еще?

Кроме того, каков наилучший курс действий здесь? Является ли установка этого ленивого = ложного значения нецелесообразной? Должен ли я создать интерфейс, который реализует класс, и затем сопоставить его с таблицей? Или я должен просто прикусить пулю и отметить все существующие методы в классе virtual?

Заранее спасибо за любые советы!

Ответы [ 3 ]

4 голосов
/ 03 марта 2009

Я всегда указываю lazy = false на уровне класса в NHIbernate, потому что я не хочу, чтобы NHibernate заставлял меня объявлять, что свойства должны быть виртуальными, если я не хочу этого в моей модели классов.

Когда вы указываете 'lazy' в отображении класса (по умолчанию), NHibernate использует класс 'Dynamic Proxy' во время выполнения. Этот Динамический Прокси является классом, который наследуется от вашего класса. Тогда, насколько я понимаю, экземпляр класса должен быть инициализирован лениво / по требованию. В некоторых случаях это должно быть лучше для производительности (по крайней мере, так говорят).

Но, так как мне не нравится, что NHibernate говорит мне, как должен выглядеть мой класс, я всегда указывал lazy = false для всех своих классов, и у меня еще не было проблем. :)

2 голосов
/ 03 марта 2009

Использование отложенной загрузки очень эффективно при ограничении количества объектов. Эта функция может быть чрезвычайно полезна в определенных ситуациях. Например, представьте, что у вас есть два объекта «Пользователь» и «Роль», и что все пользователи имеют одну или несколько ролей. Когда вы загружаете объект User, вы также захотите загрузить все связанные с ним роли. Однако при загрузке ролей для этого пользователя вы не захотите загружать всех пользователей, связанных с этой ролью, поскольку это может привести к загрузке всей базы данных пользователей.

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

1 голос
/ 10 мая 2009

Роб, Это просто плохой дизайн. У пользователя будет список типа Role, но у роли не будет списка типа User. Пользователь - это совокупный корень, чтобы получить всех пользователей в роли, определите метод для пользователя в GetByRole (). 2 пути обхода, как вы описали, создают ужасную модель предметной области. Google "круговые ссылки" и посмотреть, почему это плохо.

...