саморефлексивное отношение n: m с использованием составных ключей в nhibernate - PullRequest
2 голосов
/ 11 октября 2010

У меня есть устаревшая база данных с 3 таблицами, подобными этой:
Рисование таблиц http://www.bilder -hochladen.net / files / gch8-1.png
Таблица Items содержит всеЭлементы в плане.Таблица Структура определяет отношение между элементами.Родительский элемент определяется company, year, planId и parentItem таблицы structure, сопоставляемыми с company, year, planId и id таблицы item.
Дочерний элемент определяется company, year, planId и childItem таблицы structure, сопоставляемой с company, year, planId и id таблицы item.

Я ищу способ отображения: m в nhibernate с использованием hbm или беглых отображений.

Я придумала:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
  <class name="Item" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
        <key-property name="Company" column="`company`" />
        <key-property name="Year" column="`year`" />
        <key-property name="Planid" column="`planid`" />
        <key-property name="ItemId" column="`id`" />
    </composite-id>  
    <!-- Some other properties -->

    <set name="Parents" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`parentItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <set name="Childs" table="`structure`" fetch="select">
        <key>
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`childItem`" />
        </key>
        <many-to-many class="Item">        
            <column name="`company`" />
            <column name="`year`" />
            <column name="`planid`" />
            <column name="`id`" />
        </many-to-many>
    </set>

    <many-to-one name="Plan" class="Plan" not-null="true" fetch="select">
        <column name="`company`" />
        <column name="`planid`" />
    </many-to-one>
  </class>
</hibernate-mapping>

Ошибкаоднако это: Repeated column in mapping … - так что я застрял.Есть предложения?

1 Ответ

0 голосов
/ 19 октября 2010

Ну, мне удалось решить это. Ключ должен был использовать ключ-многие-к-одному (KeyReference в FluentNHibernate) и , а не , чтобы сделать отображение n: m (потому что оно не работает!):

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Project.Model" assembly="Project" xmlns="urn:nhibernate-mapping-2.2">
<class name="Item" lazy="true" table="`item`" schema="`dbo`">
  <composite-id>
    <key-many-to-one name="Plan" class="Plan">
      <column name="Company" column="`company`" />
      <column name="Planid" column="`planid`" />
    </key-many-to-one>
    <key-property name="Year" column="`year`" />
    <key-property name="ItemId" column="`id`" />
  </composite-id>  
  <!-- Some other properties -->

  <set name="Parents" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`parentItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>

  <set name="Childs" table="`structure`" fetch="select">
    <key>
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`childItem`" />
    </key>
    <many-to-many class="Item">        
        <column name="`company`" />
        <column name="`year`" />
        <column name="`planid`" />
        <column name="`id`" />
    </many-to-many>
  </set>
  </class>

  <class name="Structure" lazy="true" table="`item`" schema="`dbo`">
    <composite-id>
  <key-many-to-one name="Parent" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="parentItem" />
  </key-many-to-one>
  <key-many-to-one name="Child" class="Item">
    <column name="company" />
    <column name="year" />
    <column name="planid" />
    <column name="childItem" />
  </key-many-to-one>
  <key-property name="StructureId" column="structureId" />
</composite-id>      
</class>

</hibernate-mapping>

Это выглядит несколько странно, особенно часть, в которой компания, год и планид дважды находятся в ключе структуры. Но это работает ...

...