Сопоставление нескольких значений объекту Value в NHibernate
-
03-07-2019 - |
Вопрос
я довольно новичок в NHibernate, и хотя я нахожу в Интернете тонны информации о NHibernate mapping, я слишком глуп, чтобы найти эту информацию.
Итак, проблема в том, что у меня есть следующая модель:
вот как бы я хотел, чтобы это выглядело.Один чистый человек, у которого есть два адресных свойства.
В базе данных я бы хотел сохранить это в одной таблице.Таким образом, строка Person будет содержать ShippingStreetname и столбец Streetname, один из которых сопоставлен с ShippingAddress .Streetname, а другой - с Address .StreetName
Я нашел статья о беглых интерфейсах, но до сих пор не понял, как это сделать с помощью конфигурации XML.
Заранее спасибо!
Обновить:Я сам нашел решение этой проблемы.Это может быть сделано через узел и работает довольно просто.
Чтобы добиться сопоставления Address и ShippingAddress, мне просто нужно было добавить следующее в
<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>
Решение
ОК.Я сам нашел решение.Ключом является конструкция в конфигурации 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>
Другие советы
вы можете настроить это как два отношения. например.
<many-to-one name="ShippingAddress" class="Yournamespace.Address"/>
<many-to-one name="Address" class="Yournamespace.Address"/>
Вам даже не нужен идентификатор для адреса.Только подумайте, как дорого обходится поддержание удостоверения личности.У вас проблемы с параллелизмом, вам нужна уникальность и так далее.Это цель ValueObjects (не путайте с System.ValueObject, смотрите определение DDD для ValueObject).В этом случае Address является ValueObject, поэтому для него не требуется идентификатор.И если вам нужна коллекция адресов, вы сопоставляете ее как "" смотрите http://www.nhforge.org/doc/nh/en/index.html#collections-ofvalues.