Каково влияние lazy = "false" на элемент класса отображения NHibernate?

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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