2009-10-13 2 views
3

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

<?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> 

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

Как я могу получить это работать? То есть Я ожидаю, что:

select * from Vehicle 
    inner join Make on Make.MakeId = Vehicle.Make Id 
+0

извинения, StackOverflow вырезал остальную часть файла сопоставления. Остальное соглашается с таблицей Vehicle и прекрасно работает, его просто соединение, чтобы я не мог сортироваться. – januszstabik

+0

Я отредактировал ваш вопрос с помощью синтаксиса StackOverflow, так что все будет выглядеть, красиво отформатировано и окрашено :-) – KLE

ответ

0

Вы должны сопоставить класс 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> 

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

+1

У меня уже было это так. Это дает Транспортному средству свойство Make objesct (к сожалению, таблица Make также присоединяется к другим таблицам с внешними ключами, и мне не нужен ужасно глубокий граф объектов). Я не могу изменить схему db, так как клиент должен поддерживать устаревшие приложения. Поэтому то, что я хочу достичь, больше похоже на «представление», в результате чего извлекаются все соответствующие столбцы из объединенных таблиц. Это будет работать так же, как совокупная таблица в EF. – januszstabik

+0

nhibernate many-to-one отношения по умолчанию являются ленивыми, поэтому граф объектов не будет выбран, если вы не укажете иное. –

+0

Я могу обойти проблему загрузки, это прекрасно. Схема DB очень нормализована, что означает, что мой объект-граф в местах может быть 5-6 объектов в глубину, что еще больше означает, что будет использовать синтаксис, например object1.object2.object3.object4.object5.object6.Name. Я не уверен, что клиент понравится, поэтому хотел найти решение, прежде чем я сказал, что это невозможно. – januszstabik