2012-03-19 104 views
1

我在使用NHibernate(版本3.2,与Visual Studio 2010)时遇到问题。NHibernate渴望加载需要在这里?

我尝试在页面上加载任务。一项任务被附加到一名雇员(通过外键)。

类:

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> 

页:

因为代理服务器设置为任务的员工属性

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

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

每当我在浏览器中打开页面时,得到一个错误。

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

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

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

回答

2

可以使用QueryOver它:

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

该查询得到与真正的员工对象(不是代理)

+0

漂亮的所有任务 - 不知道这一点.. – bernhardrusch 2012-03-20 11:02:57