Nhibernate表(按层级)和自参考表

Nhibernate表(按层级)和自参考表,nhibernate,Nhibernate,我有这样一个问题 <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Altkom.Model" namespace="Altkom.Model"> <class name ="Employee" table="Employee" discriminator-value="Employee">

我有这样一个问题

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Altkom.Model" namespace="Altkom.Model">
  <class name ="Employee" table="Employee" discriminator-value="Employee">
    <id name ="EmployeeId" column="EmployeeId">
      <generator class="uuid.hex" />
    </id>
    <discriminator column="Discriminator" not-null="true" type="System.String"/>
    <property name="FirstName" column="FirstName" not-null="true" />
    <property name="LastName" column="LastName" not-null="true" />
    <property name="BirthDate" column="BirthDate" not-null="true"/>
    <property name="Sex" column="Sex" not-null="true" />
    <!--<property name="ManagerId" column="ManagerId"/>-->
    <component name="Address" class="Altkom.Model.Address, Altkom.Model">
      <property name="City" column="City" not-null="true" />
      <property name="Street" column="Street" not-null="true" />
      <property name="Country" column="Country" not-null="true" />
      <property name="ZipCode" column="ZipCode" not-null="true" />
    </component>
    <bag name="Projects" table="EmployeeProject" lazy="true">
      <key column="EmployeeId"/>
      <many-to-many column="ProjectId" class="Project" />
    </bag>
    <bag name="JobHistories" lazy="false">
      <key column="EmployeeId"/>
      <one-to-many class="JobHistory"/>
    </bag>
    <many-to-one name ="Manager" class="Altkom.Model.Manager, Altkom.Model" column="ManagerId"/>
    <subclass name="Manager" discriminator-value="Manager">
      <!--<many-to-one name ="Employee" class="Altkom.Model.Employee, Altkom.Model" column="EmployeeId" not-null="false" cascade="all-delete-orphan" lazy="false"/>-->
      <bag name="Subordinates" lazy="false" inverse="true" cascade="all-delete-orphan">
        <key column="ManagerId"/>
        <one-to-many class="Employee"/>
      </bag>
      <property name="RoomNumber" column="RoomNumber"/>
    </subclass>
  </class>
</hibernate-mapping>
我应该怎样做才能使下属的财产运转良好。
感谢您的建议。

我们在NH应用程序中使用了非常类似的结构。我可以看到与您的映射的区别是:

1) 我们不嵌套类定义 2) 我们在多对一元素上指定fetch='select' 3) 我们在bag元素上使用lazy='true'

因此,重新处理映射将如下所示:

<class name ="Employee" table="Employee" discriminator-value="Employee">
   ...
   <many-to-one name ="Manager" fetch="select" class="Altkom.Model.Manager, Altkom.Model" column="ManagerId"/>
   ...
</class>
<subclass name="Manager" extends="Employee" discriminator-value="Manager">
   <bag name="Subordinates" lazy="true" inverse="true" cascade="all-delete-orphan">
     <key column="ManagerId"/>
     <one-to-many class="Employee"/>
   </bag>
   ...
</subclass>

...
...
...

[顺便提一下,我怀疑您是否真的想为Manager使用子类。当某人被提升时会发生什么?或者您只是想分配一个下级下属?您将需要更改此对象的类型,并可能重新创建行并更新所有相关记录。我通常只在有相当多子类的情况下使用另一个类g型不变性]

当然可以使用NHibernate创建来自自引用数据集的对象集合。但现在我们甚至不知道您是否遇到任何问题。要让您的代码真正运行,需要比大多数人在这些问题上花费更多的精力。即使是麻烦查看其他人的映射文件而不知道问题是什么。您需要描述您遇到的任何错误或不符合您需要的行为,可能有人可以回答。您好,感谢您的答复。我的问题是下属集合。此属性始终为空,即使我在符合条件的数据库。我得到的没有错误。一切看起来都很好,但只有这一个属性的行为与我想要的不一样。再次,大家好,一切都很好。我的错误我必须去睡觉:-)好的。我想你可能会发现这个模型在未来过于严格和有问题。建模“角色”继承导致问题。在您的模型中,如果某人是“管理者”,这是其实体标识的基本部分。如果我们有一个基类“哺乳动物”,我们可以有子类“猫”、“狗”、“人”,这些都是真正的基本实体标识的一部分。“管理者”不符合这种范式,它是一个角色,是暂时的,不是身份。我建议使用一个类(个人或员工等)来收集角色对象。角色应该是“经理”等。
<class name ="Employee" table="Employee" discriminator-value="Employee">
   ...
   <many-to-one name ="Manager" fetch="select" class="Altkom.Model.Manager, Altkom.Model" column="ManagerId"/>
   ...
</class>
<subclass name="Manager" extends="Employee" discriminator-value="Manager">
   <bag name="Subordinates" lazy="true" inverse="true" cascade="all-delete-orphan">
     <key column="ManagerId"/>
     <one-to-many class="Employee"/>
   </bag>
   ...
</subclass>