Могу ли я "объединить" две таблицы в один класс, одновременно создавая отношения многие-к-одному с помощью NHibernate? - PullRequest
1 голос
/ 20 мая 2009

У нас есть устаревшая схема базы данных, которую я попытался (безуспешно) сопоставить с NHibernate. Чтобы привести упрощенный пример, скажем, я хочу класс Person, имя которого происходит из таблицы «Person», а их фамилия происходит из таблицы «Person2». В таблице «Person» также есть Id этого человека, и я хочу, чтобы у моего класса Person было свойство Car. Я могу сопоставить все это, используя следующее:

<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="NHibernateMappingTest.Person, NHibernateMappingTest" lazy="false">
    <id name="Id" >
      <generator class="native" />
    </id>
    <property name="FirstName" />
    <many-to-one name="Car" access="property" class="NHibernateMappingTest.Car, NHibernateMappingTest" column="CarId"  cascade="save-update"/>
    <join table="Person2">
      <key column="PersonId" />
      <property name="LastName" />
    </join>
  </class>
</hibernate-mapping>

Позволяет мне комбинировать таблицы Person и Person2, и позволяет мне находить их Автомобиль - все работает отлично.

Но ... если в таблице Person2 есть HouseId этого человека, я бы хотел добавить второй элемент в мое отображение ...

<many-to-one name="House" access="property" class="NHibernateMappingTest.House, NHibernateMappingTest" column="HouseId" cascade="save-update"/>

... чтобы мой класс Person мог иметь свойство House.

Однако именно здесь все идет не так, потому что SQL, который генерирует NHibernate, предполагает, что столбец HouseId находится в таблице Person (но это не так, это в Person2), поэтому я получаю следующую ошибку:

MySql.Data.MySqlClient.MySqlException: # 42S22Неизвестный столбец 'HouseId' в 'списке полей'

Может ли NHibernate делать то, что я пытаюсь сделать, есть ли другой способ добиться этого (без изменения схемы базы данных), или я только что сделал ошибку новичка в моем файле карты?

1 Ответ

1 голос
/ 22 мая 2009

Винсент - спасибо за ваш ответ. Нет, я не вкладывал элемент tag в элемент. Но, следуя вашему предложению, я попытался, и это работает отлично! Большое спасибо за ответ.

<hibernate-mapping default-cascade="save-update" xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
      <class name="NHibernateMappingTest.Person, NHibernateMappingTest" lazy="false">
        <id name="Id" >
          <generator class="native" />
        </id>
        <property name="FirstName" />
        <many-to-one name="Car" access="property" class="NHibernateMappingTest.Car, NHibernateMappingTest" column="CarId"  cascade="save-update"/>
        <join table="Person2">
          <key column="PersonId" />
          <property name="LastName" />
          <many-to-one name="House" access="property" class="NHibernateMappingTest.House, NHibernateMappingTest" column="HouseId" cascade="save-update"/>
        </join>
      </class>
    </hibernate-mapping>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...