Присоединение к подклассу таблицы в иерархии классов в NHibernate - PullRequest
0 голосов
/ 19 января 2011

Я использую наследование таблиц на подклассы в NHibernate. У меня есть родительская таблица Attribute и дочерняя таблица AccountAttribute. У дочерней таблицы AccountAttribute есть еще один внешний ключ для таблицы CustomerProfile. Таблица CustomerProfile имеет нулевое или большее отношение к таблице AccountAttribute; то есть у меня будет коллекция AccountAttributes в моем классе CustomerProfile.

Как мне сопоставить таблицу CustomerProfile с таблицей AccountAttribute в моем отображении NHibernate, чтобы класс CustomerProfile был гидратирован с правильным AccountAttributes?

Таблица

Атрибут: Атрибут_Id (PK)

AccountAttribute: AccountAttribute_Id (PK); Attribute_Id (FK); CustomerProfile_Id (FK)

CustomerProfile: CustomerProfile_Id (PK)

Отображение для иерархии Attribute / AccountAttribute.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="Attribute, CustomerProfile" lazy="false">

    <id name="Identifier" column="Attribute_Id" access="field.camelcase">
      <generator class="identity"/>
    </id>

    <joined-subclass name="AccountAttribute, CustomerProfile" table="AccountAttribute" lazy="false">
      <key column="Attribute_Id" />
      <property name="ValueText" column="Value_Txt" access="nosetter.camelcase" />
    </joined-subclass>

  </class>
</hibernate-mapping>

Сопоставление для объекта Account

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="Account, CustomerProfile" lazy="false">

    <id name="Identifier" column="Account_Id" access="field.camelcase">
      <generator class="identity"/>
    </id>

    <!-- How do I map to the AccountAttributes table here to get the correct set? -->
    <bag name="AccountAttributes" access="field.camelcase" table="AccountAttribute">
      <key column="Account_Id" />
      <one-to-many class="AccountAttribute, CustomerProfile"/>
    </bag>

  </class>
</hibernate-mapping>

Спасибо

Кайл

1 Ответ

0 голосов
/ 20 января 2011

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

Как вы сказали, что вы используете table-per-subclass , все ваши таблицы подклассов должны использовать первичный ключ суперкласса, поэтому таблица AccountAttribute должна иметь только Attribute_id в качестве первичного ключа, который также является внешним ключом обратно к таблице Attribute.

После внесения этих изменений ваше отображение должно сработать, поскольку оно использует правильный <key />


Refs:

...