Как включить LazyLoad в Fluent NHibernate? - PullRequest
1 голос
/ 30 июля 2010

Я тестирую Fluent NHibernate с базой данных NorthWind. Теперь я создал класс Employee и EmployeeMap. Исходный код как ниже.

класс сотрудник

public class Employee
{
    public virtual int EmployeeID { get; private set; }
    public virtual string LastName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string Title { get; set; }
    public virtual string TitleOfCourtesy { get; set; }
    public virtual DateTime? BirthDate { get; set; }
    public virtual DateTime? HireDate { get; set; }
    public virtual string Address { get; set; }
    public virtual string City { get; set; }
    public virtual string Region { get; set; }
    public virtual string PostalCode { get; set; }
    public virtual string Country { get; set; }
    public virtual string HomePhone { get; set; }
    public virtual string Extension { get; set; }
    public virtual string Notes { get; set; }
    public virtual Employee ReportsTo { get; set; }
    public virtual string PhotoPath { get; set; }

    public virtual IList<Territory> Territories{ get; set; }

    public Employee()
    {
        Territories = new List<Territory>();
    }

    public virtual void AddTerritory(Territory territory)
    {
        territory.Employees.Add(this);
        this.Territories.Add(territory);
    }
}

класс EmployeeMap

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Table("Employees");

        Id(x => x.EmployeeID);
        Map(x => x.LastName);
        Map(x => x.FirstName);
        Map(x => x.Title);
        Map(x => x.TitleOfCourtesy);
        Map(x => x.BirthDate);
        Map(x => x.HireDate);
        Map(x => x.Address);
        Map(x => x.City);
        Map(x => x.Region);
        Map(x => x.PostalCode);
        Map(x => x.Country);
        Map(x => x.HomePhone);
        Map(x => x.Extension);
        Map(x => x.Notes);
        Map(x => x.PhotoPath);
        References(x => x.ReportsTo).Column("ReportsTo").LazyLoad();

        HasManyToMany(x => x.Territories)
        .Cascade.All()
        .Table("EmployeeTerritories")
        .ParentKeyColumn("EmployeeID")
        .ChildKeyColumn("TerritoryID");
    }
}

Затем я пытаюсь загрузить всех сотрудников из базы данных, но у всех сотрудников есть объект ссылки в свойстве ReportsTo.

var sessionFactory = CreateSessionFactory();

using (var session = sessionFactory.OpenSession())
{
    using (session.BeginTransaction())
    {
        Console.WriteLine("All employees");

        var emp_ = session.CreateCriteria(typeof(Employee));
        var employees = emp_.List<Employee>();

        foreach (var employee in employees)
        {
            Console.WriteLine(employee.FirstName); // every employee has reference object on ReportsTo property here.
        }

        Console.Write("--------");
    }
}

Я хочу знать, что не так с моим кодом и как его исправить?

Ответы [ 2 ]

4 голосов
/ 02 августа 2010

Ленивая загрузка включена по умолчанию.Ссылка в ReportsTo - это прокси, который будет загружен из БД только в том случае, если используется какое-либо свойство, отличное от идентификатора.

0 голосов
/ 30 июля 2010

Ленивая загрузка не включена по умолчанию.

public EmployeeMap()
{
    Table("Employees");
    LazyLoad();

    // etc.
}

При этом тестирование с помощью оператора foreach может быть вредным, поскольку, даже если вы включили отложенную загрузку, вторую вы запрашиваете «сотрудник».FirstName ", NHibernate попадет в базу данных и выдаст результаты.Вам лучше ловить сгенерированный SQL NHibernate или просто использовать NHibernate Profiler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...