2010-07-30 2 views
1

저는 Fluent NHibernate와 NorthWind 데이터베이스를 테스트하고 있습니다. 이제는 Employee 및 EmployeeMap 클래스를 만들었습니다. 소스 코드는 아래와 같습니다.Fluent NHibernate에서 LazyLoad를 활성화하는 방법은 무엇입니까?

클래스 직원

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("--------"); 
    } 
} 

알고 싶습니다. 내 코드가 무엇이고 어떻게 수정해야합니까?

답변

4

지연로드는 기본적으로 사용됩니다. ReportsTo의 참조는 ID가 아닌 다른 속성이 사용 된 경우에만 DB에서로드되는 프록시입니다.

-2

기본적으로 지연로드는 사용되지 않습니다. 당신이 게으른 로딩을 사용하도록 설정 한 경우에도, 당신은 "employee.FirstName"쿼리 두 번째는, NHibernate에 데이터베이스를 쳤고 결과를 반환하기 때문에 밝혔다되고 그건

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

    // etc. 
} 

는 foreach 문으로 테스트, 장난이 될 수 있습니다. 당신은 더 나은 NHibernate의 생성 된 SQL 잡기 또는 그냥 NHibernate Profiler 사용하고 있습니다.

+4

틀린. Lazy loading *은 모든 관계에서 기본적으로 사용 가능합니다. –

관련 문제