2013-04-03 2 views
1

У меня есть эта связь между автомобилем, байком, объектом скейтборда с объектом Person. Отношения хранятся в таблице «Собственность».Как создать сопоставление отношений NHibernate между несколькими объектами в другой объект (например, наследование)

Car, Bike, Skateboard map to Person

Как создать это отображение в NHibernate? Я пытаюсь следовать этому руководству: http://nhibernate.info/doc/nh/en/index.html#inheritance. Любая помощь приветствуется.

+0

Опубликуйте .hbm.xml позже. Кажется, что я должен использовать сопоставление наследования, но какой тип сопоставления лучше всего: таблица для конкретного класса? Или используя неявный полиморфизм (см. Ссылку выше)? –

+0

Должен признаться, эта модель кажется мне немного странной. Я бы ввел класс Vehicle как суперкласс автомобиля/велосипеда/sb. Этот класс будет содержать логику typecode. Тогда вы можете положиться на стратегию «таблица на иерархию» – jbl

+0

Фактически, Car/Bike/Skateboard - это просто образец. В нашем реальном приложении реальные объекты сильно отличаются. Например, даже Идентификатор каждого класса отличается - некоторые используют Int64, некоторые используют GUID ... Чтобы спросить, я упростил их как Car/Bike/Skateboard. –

ответ

0

Вот вариант, с таблицей на иерархию. Я предполагаю:

  • собственность имеет свой собственный идентификатор (OwnerShipId, автоматически сгенерированный)
  • у вас есть столбец за ссылочный класс/таблиц (BikeId, CarId), для обработки различных типов ключей и внешние ключей

отображение будет выглядеть примерно так:

<class lazy="false" name="Domain.OwnerShip, Domain" table="OwnerShip_Table" discriminator-value="0"> 
<id name="Id" column="OwnerShipId" type="System.Int32" access="property"> 
    <generator class="identity"></generator> 
</id> 
    <discriminator column="VehicleTypeCode" type="int"/> 
    <many-to-one name="Owner" column="PersonId" not-null="true" fetch="..."/> 
    <many-to-one name="CodeType" column="VehicleTypeCode" not-null="true" fetch="..." /> 
<subclass name="Domain.BikeOwnerShip, Domain" discriminator-value="1"> 
     <many-to-one name="Bike" column="BikeId" not-null="true" fetch="..."/> 
    </subclass> 
<subclass name="Domain.CarOwnerShip, Domain" discriminator-value="2"> 
     <many-to-one name="Car" column="CarId" not-null="true" fetch="..."/> 
    </subclass> 
</class> 

Я думаю, было бы также неплохо иметь виртуальный, не сопоставляется, OwnedObject свойства в базовом классе, что-то вроде

public virtual Object OwnedObject{ 
           get{return null;} 
} 

в CarOwnership классе реализация OwnedObject будет

public override Object OwnedObject{ 
           get{return this.Car;} 
} 

Надеется, что это поможет

1

Вот как я могу это сделать ,

<class lazy="false" name="Domain.OwnerShip, Domain" table="OwnerShip_Table"> 
    <id name="Id" column="OwnerShipId" type="System.Int32" access="property"> 
    <generator class="identity"></generator> 
    </id> 
    <joined-subclass name="Car" table="Cars" lazy="false"> 
    <key column="Id" /> 
    <property name="Owner" /> 
    </joined-subclass> 
    <joined-subclass name="Bike" table="Bikes" lazy="false"> 
    <key column="Id" /> 
    <property name="Owner" /> 
    </joined-subclass> 
    <joined-subclass name="Skateboard" table="Skateboards" lazy="false"> 
    <key column="Id" /> 
    <property name="Owner" /> 
    </joined-subclass> 
</class> 

Вы, вероятно, хотите таблицу лиц, а также лицо Entity с отображением где человек имеет мешок OwnedVehicles.