需要NHibernate急切加载吗?

时间:2012-03-19 13:33:02

标签: .net nhibernate lazy-loading

我在使用NHibernate时遇到了问题(版本3.2,使用Visual Studio 2010)。

我尝试在页面上加载任务。任务附加到员工(通过外键)。

类:

public class Task
{                                   
    private Employee employee;

    public virtual Employee Employee
    {
        get
        {
            return employee;
        }

        set
        {
            employee = value;
        }
    }
}

库-方法:

public List<Task> GetAll()
    {
        using (ISession session = Configuration.SessionProvider.OpenSession())
        {
            var tasks = session
                .CreateCriteria(typeof(Task))
                .List<Task>()
                .ToList();

            return tasks;
        }
    }

映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test1.Domain.Model" assembly="Test1.Domain">
<class name="Task" table="Task">
    <id name="Id" column="TaskId">
        <generator class="identity"/>
    </id>

    <many-to-one name="Employee" class="Employee" column="EmployeeId"/>

</class>

页:

<asp:GridView runat="server" ID="taskGrid" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField DataField="Id" HeaderText="Task ID" />
            <asp:BoundField DataField="Employee" HeaderText="Employee" />
        </Columns>
    </asp:GridView>

taskGrid.DataSource = taskRepository.GetAll();
taskGrid.DataBind();

每当我在浏览器中打开页面时,都会收到错误:

Initializing[Test1.Domain.Model.Employee#1]-Could not initialize proxy - no Session.

因为为任务的employee-property设置了代理。

与调试步骤相同(F10)。但当我进入GetAll()方法(F11)时,任务的员工已完全加载(无代理)。

我很困惑为什么NHibernate会对不同的调试技术做出不同的反应。我最感兴趣的是

  1. 我的情况下是否需要急切加载?
  2. 为什么加载相关实体取决于我调试NHibernate的方式?

1 个答案:

答案 0 :(得分:2)

您可以使用QueryOver:

Session.QueryOver<Task>()
 .Fetch(task => task.Employee).Eager
 .TransformUsing(Transformers.DistinctRootEntity)
 .List<Task>();

此查询使用真实员工对象(非代理)获取所有任务