延迟加载不适用于Fluent NHibernate

时间:2013-11-24 14:30:58

标签: c# nhibernate lazy-loading fluent

由于我刚刚开始使用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);
    }
}

//////////////////////////////我的问题/////////////// ////////////////

所以我想要做的是加载一个COMPANY实例而不加载EMPLOYEES列表,然后只在必要时加载。

我猜它引用了lazyloadind的概念,因为我已经声明了类级别LazyLoad();我不明白为什么NHibernate在加载COMPANY对象时仍然会加载所有内容。

以下是搜索公司对象的代码示例:

PS。:_nhibernateSession已经是一个开放的会话。

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

1 个答案:

答案 0 :(得分:0)

您是否100%确定它不会触发另一个查询来加载员工列表?使用sql server profiler搞清楚......

无论如何,映射它的正确方法是

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