NHibernate中的继承和延迟加载

NHibernate中的继承和延迟加载,hibernate,nhibernate,inheritance,lazy-loading,Hibernate,Nhibernate,Inheritance,Lazy Loading,参加以下课程: public class Employee { public Employee Manager { get; set; } } public class ShopFloorEmployee : Employee { ... } public class OfficeEmployee : Employee { ... } public class Department { public Employee Manager { get; set; } }

参加以下课程:

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,他是一名车间员工)将是EmployeeProxy类型。然后,在同一个会话中,如果我专门加载所有ShopFloorEmployees的列表,那么它们都将是ShopFloorEmployees类型,除了Bob之外,Bob将是EmployeeProxy类型。因此,我根本无法将Bob塑造成ShopFloorEmployee,因为它遵循了不同的继承路径

代理是必要的,以避免每次我加载一个部门或员工时,通过其经理递归加载员工负载


我是在做一些根本错误的事情,还是这是NHibernate的怪癖?如果这是一个怪癖,那么有没有解决办法?我曾考虑过在加载部门后明确关闭会话,但这似乎太过粗糙。

这是一个常见的问题。尝试将
管理器
引用更改为a。

这是一个常见问题。尝试将
Manager
引用更改为。

此问题的常见解决方法是添加
Self
属性以访问非代理类型:

public virtual Employee Self
{
   get { return this; }
}
然后您可以检查Bob.Self是否为ShopFloorEmployee


就我个人而言,我很少使用继承,我会在这里使用“角色”属性,而不是子类化。

此问题的常见解决方法是添加
Self
属性来访问非代理类型:

public virtual Employee Self
{
   get { return this; }
}
然后您可以检查Bob.Self是否为ShopFloorEmployee


就我个人而言,我很少使用继承,我会在这里使用“角色”属性,而不是子类化。

我有一个类似的问题,请参见这里:

我选择使用基于访问者模式的解决方案


您不需要关闭延迟加载,也不需要使用有趣的属性来返回self对象

我有一个类似的问题,请参见此处:

我选择使用基于访问者模式的解决方案


你不需要关闭延迟加载,也不需要使用有趣的属性来返回self对象

如果人们需要它,当我有时间的时候,我会添加查询代码。如果人们需要它,当我有时间的时候,我会添加查询代码。我不确定为什么这个dodn对我不起作用,可能是我做错了什么。我正试图解决一个复杂领域中的问题。如果我从一开始就知道这一点,我本可以设计它,而且这将是一条正确的道路。我不知道为什么这个多德不适合我,很可能我做错了什么。我正试图解决一个复杂领域中的问题。如果我从一开始就知道这一点,我可以在中设计它,这将是正确的方向。这是一个很好的解决方案,可以解决现有领域中的问题。如果我从一开始就设计它,我会使用khelland的答案,但这对我的帮助最大。这是一个很好的解决方案,可以解决现有领域中的问题。如果我从一开始就设计它,我会使用khelland的答案,但这对我的帮助最大。