Внешний ключ карты NHibernate

У меня есть две таблицы, Автомобиль и Марка. Они объединяются с использованием MakeId в качестве внешнего ключа в таблице Vehicle. Мой файл сопоставления выглядит примерно так

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2">
      <class name="Demo.Business.Objects.Vehicle, Demo.Business.Objects" table="Vehicle" >
        <id name="VehicleId" type="int" >
          <generator class="native"  />
        </id>
        <property name="RegNumber" type="String" />
        <property name="VehicleId" type="int" />
        <property name="CustomerId" type="int" />

        <join table="Make"  fetch="join">

          <key column="MakeId" foreign-key="MakeId"/>
          <property name="Description"  type="String"  />
        </join>
      </class>
    </hibernate-mapping>

Я бы подумал, что это объединит две таблицы в идентификаторе make, однако SQL, сгенерированный ios, пытается выполнить следующее соединение: vehicle.vehicleid = make.makeid.

Как я могу заставить это работать? Т.е. я ожидаю:

    select * from Vehicle
    inner join Make on Make.MakeId = Vehicle.Make Id
13.10.2009 14:22:59
Извините, StackOverflow вырезал остальную часть файла сопоставления. Остальное относится к столу «Автомобиль» и работает нормально, это всего лишь соединение, которое, кажется, не может быть отсортировано.
januszstabik 13.10.2009 14:24:01
Я отредактировал ваш вопрос с помощью синтаксиса StackOverflow, чтобы все выглядело и было красиво отформатировано и раскрашено :-)
KLE 13.10.2009 14:42:59
1 ОТВЕТ

Вам нужно сопоставить класс Make по-другому:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2">
  <class name="Demo.Business.Objects.Vehicle, Demo.Business.Objects" table="Vehicle" >
    <id name="VehicleId" type="int" >
      <generator class="native"  />
    </id>
    <property name="RegNumber" type="String" />
    <property name="VehicleId" type="int" />
    <property name="CustomerId" type="int" />
    <many-to-one name="Make" column="MakeId"/>
  </class>
  <class name="(blahblah).Make, blahblah">
    <id name="MakeId" type="int">
      <generator class="native" />
    </id>

    <property name="Description"  type="String"  />
  </class>
</hibernate-mapping>

Ваш класс "Vehicle" должен иметь свойство Make типа Make.

0
13.10.2009 14:47:12
У меня уже было так. Это дает транспортному средству свойство объекта Make (к сожалению, таблица Make также присоединена к другим таблицам с внешними ключами, и мне не нужен ужасно глубокий граф объектов). Я не могу изменить схему базы данных, так как клиент должен поддерживать устаревшие приложения. Поэтому то, чего я хочу достичь, это больше похоже на «представление», при котором извлекаются все соответствующие столбцы из соединенных таблиц. Это будет работать как таблица агрегирования в EF.
januszstabik 13.10.2009 15:00:38
nhibernate отношения многие-к-одному по умолчанию ленивы, поэтому граф объекта не будет выбран, если вы не укажете иначе.
Jan Willem B 13.10.2009 16:14:54
Я могу обойти проблему загрузки, это хорошо. Схема БД очень нормализована, что означает, что мой граф объектов местами может иметь глубину 5-6 объектов, что означает использование синтаксиса, подобного object1.object2.object3.object4.object5.object6.Name. Я не уверен, что клиенту понравится это, поэтому хотел найти решение, прежде чем я сказал, что это не может быть сделано.
januszstabik 14.10.2009 10:00:28