2013-11-24 5 views
0

Как я только начинаю с Fluent NHibernate, я создаю очень простой пример приложения, классы ведьм описаны ниже:Lazyloading не работает с Fluent NHibernate

////////// //////////////////// DOMAIN CLASSES //////////////////////////// ///

public class Company 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Employee> Employees { get; set; } 

    public Company() 
    { 
     Employees = new List<Employee>(); 
    } 
} 

public class Employee 
{ 
    public virtual int Id { get; set; } 
    public virtual int Idade { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual Company objCompany { get; set; } 
} 

////////////////////////////// КАРТ КЛАССЫ //////// ///////////////////////

public class CompanyMap : ClassMap<Company> 
{ 
    public CompanyMap() 
    { 
     LazyLoad(); 
     Id(x => x.Id); 
     Map(x => x.Name); 
     HasMany(x => x.Employees).Cascade.All(); 
    } 
} 

public class EmployeeMap : ClassMap<Employee> 
{ 
    public EmployeeMap() 
    { 
     LazyLoad(); 
     Id(x => x.Id); 
     Map(x => x.Idade); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
     Map(x => x.Cargo); 
     References(x => x.objCompany); 
    } 
} 

//////////////////// ////////// МОЙ ВОПРОС ///////////////////////////////

Так что я хотел бы сделать, это загрузить экземпляр КОМПАНИИ, не загружая список СОТРУДНИКОВ, а затем загружать только при необходимости.

Я предполагаю, что это связано с понятием lazyloadind и, поскольку я уже объявил уровень класса LazyLoad(); Я не понимаю, почему NHibernate все еще загружает все, когда я загружаю объект КОМПАНИИ.

Вот Exemple кода для поиска объекта компании:

PS .: _nhibernateSession уже openned сессия.

public static IList<Company> FindAll() 
{ 
    return _nhibernateSession.QueryOver<Company>().List(); 
} 

ответ

0

Вы на 100% уверены, что не запускаете другой запрос для загрузки списка сотрудников? Используйте SQL Profiler сервер, чтобы понять это ...

В любом случае, правильный способ отобразить его в

HasMany(x => x.Employees).Cascade.All().LazyLoad(); 
+0

Да, я знаю, что стреляет еще один запрос для загрузки и я попытался сопоставить этот путь слишком, но он по-прежнему загружает список сотрудников. – user3027402

+0

В моем официальном проекте у меня есть несколько таблиц со многими отношениями OneToMany, и если я загружаю каждый список, каждый раз, когда вы ищете родительский объект, у моего приложения могут быть некоторые проблемы с производительностью. – user3027402

+0

В примере кода ... Если я ищу все компании: IList mylist = CompanyRepository.FindAll(); на данный момент .. Я хотел бы иметь ТОЛЬКО объект Компания БЕЗ КАКИГО-ЛИБО списка (null). И ТОГДА, ЕСЛИ мне нужно ... Я получаю список сотрудников, просто обращающихся к списку сотрудников. Пример: foreach (элемент var in mylist [0] .employees) { var test = item.Name; } Если я ошибаюсь, сообщите мне. Спасибо, что помогли мне! – user3027402

Смежные вопросы