采取以下类别:继承和延迟加载NHibernate的
public class Employee
{
public Employee Manager { get; set; }
}
public class ShopFloorEmployee : Employee { ... }
public class OfficeEmployee : Employee { ... }
public class Department
{
public Employee Manager { get; set; }
}
,这里是NHibernate的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Domain.Entities"
assembly="Domain">
<class name="Employee">
<id name="Id" column="Id" type="long">
<generator class="identity"/>
</id>
<discriminator column="Type" type="string"/>
<many-to-one name="Manager" class="Employee" column="ManagerId" lazy="proxy" />
<subclass name="ShopFloorEmployee" discriminator-value="ShopFloorEmployee" extends="Employee"/>
</subclass>
<subclass name="OfficeEmployee" discriminator-value="OfficeEmployee" extends="Employee"/>
</subclass>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Domain.Entities"
assembly="Domain">
<class name="Department">
<id name="Id" column="Id" type="long">
<generator class="identity"/>
</id>
<discriminator column="Type" type="string"/>
<many-to-one name="Manager" class="Employee" column="ManagerId" lazy="proxy" />
</class>
</hibernate-mapping>
这些代理似乎是造成我的问题。例如,如果我加载一个部门,那个部门的经理(我们称他为Bob,他是一个ShopFloorEmployee)将是EmployeeProxy类型。然后,在同一个会话中,如果我专门加载所有ShopFloorEmployees的列表,它们将全部属于ShopFloorEmployee类型,除了Bob,其将是EmployeeProxy类型。然后,我根本无法将Bob作为ShopFloorEmployee,因为它遵循不同的继承路径。
为了避免每次加载部门或员工时递归地加载负载的员工通过他们的经理代理是必要的。
我在这里做了一些根本性的错误,或者这是NHibernate的怪癖吗?如果这是一个怪癖,那么是否有解决方法?我已经考虑在加载部门之后明确地关闭会话,但这看起来太过分了。
如果人们需要它,当我得到片刻时,我将添加查询代码。 –