Как сопоставить составной идентификатор и многие к одному (несколько столбцов) с общим столбцом - PullRequest
2 голосов
/ 18 марта 2012

У меня проблема с общим столбцом между составным идентификатором и отношением "многие к одному" в большой устаревшей базе данных.Я упростил задачу до отображения ниже, которое воспроизводит проблему:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Alfa">    
    <composite-id name="AlfaId" class="AlfaCompositeId">
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" />
      <key-property name="CharlieId1" column="CHARLIE_ID1" />
    </composite-id>
    <many-to-one name="C" class="Charlie">
      <column name="CHARLIE_ID1" />
      <column name="BRAVO_ID" />
    </many-to-one>
    <property name="CookieA" column="COOKIE_A" />
    </class>
  <class name="Bravo">
    <id name="BravoId" column="BRAVO_ID" />
    <property name="CookieB" column="COOKIE_B" />
  </class>
  <class name="Charlie">
    <composite-id>
      <key-property name="CharlieId1" column="CHARLIE_ID1" />
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" /> <!-- Reused column !!! -->
    </composite-id>
    <property name="CookieC" />
  </class>
</hibernate-mapping>

При попытке сохранить сущность Alfa будет получено:

IndexOutOfRangeException (Message=Invalid index 3 for this SqlParameterCollection with Count=3).

NHibernate пытается добавить значение столбца BRAVO_ID дважды.Один раз для составного идентификатора и один раз для многих на один FK.

Любой способ, как перейти к отображению XML, чтобы сказать NHibernate игнорировать второе отображение столбца 'BRAVO_ID'?

Любые советы приветствуются.

1 Ответ

0 голосов
/ 19 марта 2012

вы сопоставили те же столбцы, что и CompositeId и ManyToOne, просто избавьтесь от CompositeId

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Alfa">    
    <composite-id>
      <key-many-to-one name="Charly" class="Charlie">
        <column name="CHARLIE_ID1" />
        <column name="BRAVO_ID" />
      </key-many-to-one>
    </composite-id>
    <property name="CookieA" column="COOKIE_A" />
  </class>

  <class name="Bravo">
    <id name="Id" column="BRAVO_ID" />
    <property name="CookieB" column="COOKIE_B" />
  </class>

  <class name="Charlie">
    <composite-id>
      <key-property name="IdPart1" column="CHARLIE_ID1" />
      <key-many-to-one name="Bravo" class="Bravo" column="BRAVO_ID" />
    </composite-id>
    <property name="CookieC" />
  </class>
</hibernate-mapping>

и доступ к нему через свойство

Bavo b = alfa.Charly.Bravo;

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