свободный nhibernate - хранение и извлечение трех классов в / из одной таблицы - PullRequest
1 голос
/ 20 мая 2010

нубский вопрос.

У меня есть такая ситуация, когда у меня есть следующие объекты:

class Address
{      
   string Street;
   string City;
   ...
}

class User
{
   string UserID;
   Address BillingAddress;
   Address MailingAddress;
   ...
}

Как правильно хранить эти данные, используя (свободно) nHibernate? Я мог бы использовать отдельную таблицу адресов и создать ссылку, но они являются отношениями 1: 1, поэтому я действительно не хочу нести накладные расходы при объединении. В идеале я бы сохранил это как одну плоскую запись.

Итак, мой вопрос: как правильно хранить экземпляр класса «Пользователь» таким образом, чтобы он сохранял свое содержимое, а также два адреса как одну запись? Насколько мне известно, я не могу понять, как я могу хранить эту информацию таким образом, чтобы две записи Address получали разные имена столбцов (например, BillingAddress_Street и MailingAddress_Street), а также как читать записи обратно в экземпляр пользователя. *

1 Ответ

7 голосов
/ 20 мая 2010

Эти типы структур упоминаются как 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_");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...