Таблица Nhibernate в соответствии с иерархией и таблицей собственных ссылок - PullRequest
0 голосов
/ 06 июня 2011

У меня такая проблема.

<?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>

Структура таблицы:

CREATE TABLE [dbo].[Employee](
    [EmployeeId] [nvarchar](255) NOT NULL,
    [Discriminator] [nvarchar](255) NOT NULL,
    [FirstName] [nvarchar](255) NOT NULL,
    [LastName] [nvarchar](255) NOT NULL,
    [BirthDate] [datetime] NOT NULL,
    [Sex] [int] NOT NULL,
    [City] [nvarchar](255) NOT NULL,
    [Street] [nvarchar](255) NOT NULL,
    [Country] [nvarchar](255) NOT NULL,
    [ZipCode] [nvarchar](255) NOT NULL,
    [ManagerId] [nvarchar](255) NULL,
    [RoomNumber] [nvarchar](255) NULL,
PRIMARY KEY CLUSTERED 
(
    [EmployeeId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK74988DB23FED7E5D] FOREIGN KEY([ManagerId])
REFERENCES [dbo].[Employee] ([EmployeeId])
GO

ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK74988DB23FED7E5D]
GO

Что я должен сделать, чтобы свойство подчиненных работало хорошо. Спасибо за любой совет.

1 Ответ

0 голосов
/ 08 июня 2011

Мы используем довольно похожую структуру в приложении NH. Различия, которые я вижу в вашем отображении:

1) Мы не вкладываем определения классов 2) Мы указываем fetch = 'select' для элемента многие-к-одному 3) Мы используем lazy = 'true' для элемента bag

Так что переделка вашего отображения будет выглядеть так:

<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. Что происходит, когда кто-то получает повышение? Или вы просто хотите назначить младшего подчиненного? Вам нужно будет изменить тип этого объекта и, вероятно, воссоздать строку и обновить все связанные записи. Обычно я использую только другой класс, где имеется довольно сильная неизменность типов]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...