2013-11-24 51 views
0

正如我只是用流利的NHibernate的开始,我创建应用程序的非常简单的例子工作,巫类描述如下:惰性加载不流利的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在加载一个COMPANY对象时仍然会加载所有的东西。

这里是一个代码为例来搜索公司对象:

PS:_nhibernateSession已经是一个openned会话。

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

回答

0

您是否100%确定它不会触发另一个查询来加载员工列表?使用SQL Server Profiler来弄明白......

不管怎么说,绘制它的正确方法是

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

是的,我知道它的发动另一查询来加载和我试过这种方式过于地图,但它仍然加载雇员名单。 – user3027402

+0

在我的官方项目中,我有一些有许多OneToMany关系的表,如果我加载每个列表,每次搜索父对象,我的应用程序可能会有一些性能问题。 – user3027402

+0

在一个代码示例... 如果我搜索所有公司的: IList的 MYLIST = CompanyRepository.FindAll(); 在这一点..我想只有对象公司WITHOUT ANY列表(空)。 然后,如果我需要......我得到刚刚访问员工名单的员工名单。像这样: foreach(var item in mylist [0] .employees) { var test = item.Name; } 如果我错了,请让我知道。 谢谢你试图帮助我! – user3027402