отображение коллекции «объекта значения» в (Свободно) NHibernate - PullRequest
1 голос
/ 17 мая 2010

У меня есть следующая сущность

public class Employee
{
   public virtual int Id {get;set;}
   public virtual ISet<Hour> XboxBreakHours{get;set}
   public virtual ISet<Hour> CoffeeBreakHours {get;set}
}

public class Hour
{
   public DateTime Time {get;set;}
}

(что я хочу сделать, так это хранить информацию о том, что сотрудник А играет в Xbox каждый день, скажем, в 9:00 13:30, а кофе-брейк - в 7:00 12:30 18:00) если мой подход действителен здесь вообще.

Вопрос в том, как мои (идеально беглые) отображения должны выглядеть здесь? Для часового класса необязательно (с моей точки зрения) иметь идентификатор или быть доступным из какого-либо хранилища.

1 Ответ

5 голосов
/ 18 мая 2010

В зависимости от того, как вы хотите это сделать, вам нужно либо сопоставить свою коллекцию как отображение элементов, либо как коллекцию компонентов (это <element> и <composite-element> в терминах NHibernate). Для первого потребуется определение IUserType, а для второго - если у вашего Hour класса будет более одного свойства.

Если вы придерживаетесь одного свойства, вам нужно определить IUserType, чтобы NHibernate знал, как преобразовывать ваш тип в базу данных и из нее. Как только вы это сделаете, вы можете отобразить его с помощью Fluent NHibernate следующим образом:

HasMany(x => x.XboxBreakHours)
  .Element("value", x => x.CustomType<YourUserType>);

Указывает, что ваша коллекция хранится в таблице со столбцом value, содержащим фактические значения. Вызов CustomType - это то, что говорит NHibernate использовать IUserType для этой коллекции.

Если у вас в классе Hour будет несколько свойств, вам нужно сделать следующее (примечание: на самом деле это очень похоже на отображение Component).

HasMany(x => x.XboxBreakHours)
  .Component(comp =>
  {
    comp.Map(x => x.Time);
    comp.Map(x => x.Another);
  });
...