Отображение нескольких значений в объект значения в NHibernate - PullRequest
0 голосов
/ 20 октября 2008

Я довольно новичок в NHibernate, и хотя я нахожу тонны информации о сопоставлении NHibernate в Интернете, я слишком глуп, чтобы найти эту информацию.

Итак, проблема в том, что у меня есть следующая модель:

Datamodel

вот как бы я хотел, чтобы это выглядело. Один чистый человек, имеющий два свойства адреса.

В базе данных я бы хотел сохранить это в одной таблице. Таким образом, строка Person будет иметь ShippingStreetname и столбец Streetname, один из которых сопоставлен с ShippingAddress.Streetname, а другой - с Address.StreetName

Я нашел статью о свободно распространяемых интерфейсах , но до сих пор не понял, как это сделать с помощью XML-конфигурации.

Заранее спасибо!

Обновление: я сам нашел решение этой проблемы. Это можно сделать через узел и работает довольно просто.

Чтобы отобразить адрес и адрес доставки, мне просто нужно добавить следующее к

<component name="Address" class="Address">
  <property name="Streetname"></property>
  <property name="Zip"></property>
  <property name="City"></property>
  <property name="Country"></property>
</component>

<component name="ShippingAddress" class="Address">
  <property name="Streetname" column="ShippingStreetname" />
  <property name="Zip" column="ShippingZip" />
  <property name="City" column="ShippingCity" />
  <property name="Country" column="ShippingCountry" />
</component>

Ответы [ 3 ]

1 голос
/ 20 октября 2008

Хорошо. Я нашел решение сам. Ключ - это конструкция в конфигурации XML, и она работает довольно хорошо.

Вот как это делается:

<component name="Address" class="Address">
  <property name="Streetname"></property>
  <property name="Zip"></property>
  <property name="City"></property>
  <property name="Country"></property>
</component>

<component name="ShippingAddress" class="Address">
  <property name="Streetname" column="ShippingStreetname" />
  <property name="Zip" column="ShippingZip" />
  <property name="City" column="ShippingCity" />
  <property name="Country" column="ShippingCountry" />
</component>
0 голосов
/ 08 июля 2011

Вам даже не нужен идентификатор для адреса. Просто подумайте, как дорого поддерживать идентификатор. У вас есть проблемы с параллелизмом, вам нужна уникальность и так далее. Это цель ValueObjects (не путайте с System.ValueObject, смотрите определение DDD для ValueObject). В этом случае Address является ValueObject, поэтому для него не требуется идентификатор. И если вам нужна коллекция адресов, вы отображаете ее как "" см. http://www.nhforge.org/doc/nh/en/index.html#collections-ofvalues.

0 голосов
/ 20 октября 2008

вы можете настроить это как два отношения. например,

<many-to-one name="ShippingAddress" class="Yournamespace.Address"/>
<many-to-one name="Address" class="Yournamespace.Address"/>
...