Свободный NHibernate + Отключить LazyLoad - PullRequest
3 голосов
/ 21 января 2011

Привет, я попытался отключить LazyLoad в своих коллекциях без удачи ... Код, который я пробовал до сих пор:

// Person.cs

public class Person
{
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual IList<Car> Cars { get; set; }

    public Person()
    {
        Cars = new List<Car>();
    }

    public virtual void AddCar(Car car)
    {
        Cars.Add(car);
    }
}

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.FirstName);
        HasMany(x => x.Cars).KeyColumn("PersonId").Cascade.AllDeleteOrphan().Not.LazyLoad();
        Table("Persons");
    }
}

// Car.cs

public class Car
{
    public virtual int Id { get; set; }
    public virtual string CarName { get; set; }
    public virtual Person Person { get; set; }
}

public class CarMap : ClassMap<Car>
{
    public CarMap()
    {
        Id(x => x.Id);
        Map(x => x.CarName);
        HasOne(x => x.Person).Not.LazyLoad();
        Table("Cars");
    }
}

Есть предложения?

Заранее спасибо!

Ответы [ 2 ]

7 голосов
/ 21 января 2011

Ленивая загрузка означает, что коллекция автомобилей будет загружена только при доступе к свойству автомобилей. Поэтому, когда вы отключаете это, при загрузке человека вы всегда будете также загружать все его машины. Чтобы убедиться, что это «работает» для вас, вы можете открыть SQL Profiler (или получить пробную версию для NHibernate profiler ) и отладить свой код. При просмотре кода вы можете увидеть, загружена ли коллекция автомобилей сразу или только при первом обращении к ней.

Короче говоря, я не думаю, что вы сделали что-то не так, просто неправильно понял концепцию.

1 голос
/ 21 января 2011

Если вы используете метод Load, попробуйте вместо него Get. Load всегда возвращает прокси и лениво загружает iirc. Остерегайтесь SELECT N + 1, хотя.

РЕДАКТИРОВАТЬ : После перечитывания других комментариев это, вероятно, работает как ожидалось. Дорон уже объяснил, как должна работать ленивая загрузка. Так что, если вы НЕ хотите загружать все машины вместе с человеком, следует включить отложенную загрузку. Ленивая загрузка уже включена по умолчанию, потому что если вы с нетерпением загружаете все свои коллекции, это приводит к ВЫБОРУ N + 1, как упоминалось ранее. То есть один выбор для человека и N для автомобилей. Такое поведение обычно нежелательно, поэтому я предупреждаю :) Ленивая загрузка означает, что коллекции будут загружаться только в случае явного запроса.

...