我在使用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会对不同的调试技术做出不同的反应。我最感兴趣的是
答案 0 :(得分:2)
您可以使用QueryOver:
Session.QueryOver<Task>()
.Fetch(task => task.Employee).Eager
.TransformUsing(Transformers.DistinctRootEntity)
.List<Task>();
此查询使用真实员工对象(非代理)获取所有任务