Я не понимаю, что вы имеете в виду под «ленивой загрузкой». Ленивая загрузка - это функция, она включена по умолчанию, и вы можете отключить ее, если она вам не нравится.
Есть два вида отложенной загрузки: для ссылок на другие сущности и для списков.
Учитывая эту сущность:
class Entity
{
// pk
int id { get; private set; }
// reference to another entity
User MyUser { get; set; }
// list to other entities
IList<Comments> MyComments { get; set; }
}
Ленивая загрузка ссылки на пользователя
Если у вас есть отложенная загрузка User, вам необходимо определить все члены класса User virtual. NHibernate создаст так называемый прокси. Прокси-сервер - это класс, определенный во время выполнения, который наследуется от пользователя. Ваш код обращается к нему как Пользователь и не знает, что это подкласс. Но когда вы обращаетесь к одному из его членов в первый раз, свойства загружаются из базы данных.
Если вы хотите отключить ленивую загрузку для класса User, вам нужно сделать это в его сопоставлении:
<class name="User" lazy="false"> ...
Затем NHibernate всегда создает экземпляры типа User, без прокси. Вам не нужно иметь ничего виртуального.
Ленивая загрузка списка комментариев
Если вы используете отложенную загрузку в списке комментариев, отложенную загрузку реализует сам список. Если вы обращаетесь к списку в первый раз, он загружается из базы данных. NHibernate использует список, реализующий IList, но не List.
Если вы хотите отключить отложенную загрузку в списке, вы делаете это в сопоставлении Entity:
<class name="Entity">
<bag name="MyComments" lazy="false" >
...
Обычно ленивая загрузка - это хорошо, и вашему приложению не нужно об этом заботиться. Но есть риски. Например, если вы сериализуете экземпляр, и это прокси, вы получаете неинициализированный прокси вместо чего-либо полезного. Ленивая загрузка работает только до тех пор, пока сеанс открыт. Не всегда использовать отложенную загрузку быстрее. Если вам все равно нужно загрузить все данные, их быстрее загрузить целиком.
Поэтому настройку нужно делать осторожно.
Изменить:
Чтобы ответить на ваш исходный вопрос: требуется ли для NHibernate ленивая загрузка? Нет. Но: Требуется ли ленивая загрузка в моем приложении? Скорее всего, да.
Думаю, ленивая загрузка не нужна только маленьким и весьма тривиальным приложениям. Если у вас есть система с большим количеством постоянных классов, вам понадобится отложенная загрузка.
person
Stefan Steinegger
schedule
20.04.2009