採取以下類別:繼承和延遲加載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的怪癖嗎?如果這是一個怪癖,那麼是否有解決方法?我已經考慮在加載部門之後明確地關閉會話,但這看起來太過分了。
如果人們需要它,當我得到片刻時,我將添加查詢代碼。 –