Сопоставить столбец несколько раз - PullRequest
1 голос
/ 23 февраля 2011

У меня довольно странное требование в моих беглых картах гибернации.У меня есть таблица (A), которая имеет отношение составного внешнего ключа с другой таблицей (B).При отображении для таблицы AI хотелось бы иметь как объект, созданный из таблицы B, так и доступ к отдельным атрибутам A, которые определяют ключ.Есть ли способ сделать это?Кажется, я получаю индекс вне диапазона исключений, если я сопоставляю столбец дважды.

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

1 Ответ

1 голос
/ 23 февраля 2011

Это вроде возможно, немного взломав.

Мы собираемся определить домен с поддельной коллекцией, которую мы будем использовать для извлечения одного связанного элемента, если он найден:

public class Foo
{
    public virtual BarKey BarKey { get; set; }
    public virtual Bar Bar { get { return Bars.SingleOrDefault(); } }
    protected virtual ICollection<Bar> Bars { get; set; }
}

public class Bar
{
    public virtual BarKey Id { get; set; }
}

//this class must override Equals and GetHashcode. Implementation not shown.
public class BarKey
{
    public virtual int X { get; set; }
    public virtual int Y { get; set; }
}

Компонент BarKey содержит свойства, которые являются частью ключа.

Теперь отображение:

<class name="Foo">
  <id ...><generator .../></id>
  <component name="BarKey">
    <property name="X" />
    <property name="Y" />
  </component>
  <bag name="Bars" inverse="true">
    <key property-ref="BarKey">
      <column name="X"/>
      <column name="Y"/>
    </key>
    <one-to-many class="Bar"/>
  </bag>
</class>
<class name="Bar">
  <composite-id name="Id">
    <key-property name="X" />
    <key-property name="Y" />
  </composite-id>
</class>

Атрибут property-ref там указывает NH сопоставить эти столбцы в Bar со свойством BarKey Foo вместо его Id.

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