Эти типы структур упоминаются как component
. Это нормализованная структура и совершенно приемлемый механизм для представления данных.
В Fluent NHibernate есть несколько способов сопоставления компонентов. Сначала есть встроенные сопоставления, а затем внешнее ComponentMap . Я бы порекомендовал последнее в вашей ситуации и в любом случае, когда у вас есть компонент, который появляется несколько раз (либо в одной и той же сущности, либо в вашем домене).
Встроенные компоненты
Чтобы отобразить компонент, самый простой способ - использовать метод Component
и указать, как компонент составляется с использованием лямбда-тела.
Component(x => x.BillingAddress, addr =>
{
addr.Map(x => x.Street);
addr.Map(x => x.City);
});
Это ваш адрес сопоставлен. Вам нужно будет повторить это для обоих адресов.
ComponentMap
Встроенное определение прекрасно работает для одноразовых компонентов, но может быстро стать утомительным, если у вас есть несколько экземпляров одного и того же компонента. ComponentMap
решает эту проблему путем выделения вашего компонента в автономное, многократно используемое определение. Вы просто используете его точно так же, как ClassMap
.
public class AddressMap : ComponentMap<Address>
{
public AddressMap()
{
Map(x => x.Street);
Map(x => x.City);
}
}
Тогда в вашем ClassMap
вам просто нужно использовать метод без тела Component
; это указывает Fluent NHibernate на поиск ComponentMap
, соответствующего типу свойства (если оно не найдено, вы узнаете об этом).
Component(x => x.BillingAddress);
Component(x => x.MailingAddress);
При использовании ComponentMap
префиксы столбцов создаются автоматически по мере необходимости на основе свойства, содержащего компонент. Если вам нужно настроить это, есть метод ColumnPrefix
, который связан с безлимитным вызовом Component
.
Component(x => x.BillingAddress)
.ColumnPrefix("Billing_");