Как настроить общий компонент с FluentNHibernate? - PullRequest
2 голосов
/ 21 мая 2010

Вот компонент, для которого я хочу настроить отображение

public class Range<T> : ValueObject
{
    public virtual T Start {get; set;}
    public virtual T Finish {get; set;}
}

В моем домене у меня есть много объектов, которые имеют свойства, такие как Range , Range ... для определенного класса со свойством x, мы настраиваем компонент следующим образом:

 persistenceModel.FindMapping<Customer>()  
     .Component<Address>            (  
                 x => x.CustomerAddress,  
                 m =>  
                 {  
                     m.Map(x => x.Street).WithLengthOf(100);  
                     m.Map(x => x.PostalCode).WithLengthOf(6);  
                     m.Map(x => x.Town).WithLengthOf(30);  
                     m.Map(x => x.Country).WithLengthOf(50);  
                 }); 

Как выглядит соглашение для всего домена как универсального T? Я что-то пропустил? Не возможно с FluentNhibernate?

1 Ответ

1 голос
/ 22 мая 2010

Вы не должны использовать FindMapping для этой цели. Возможность изменять сопоставления с помощью этого метода является упущением, и на него определенно не следует полагаться. Этот метод предназначен для проверки модели постоянства, а не для ее изменения. Если вы используете autopping, вы должны изучить overrides .


Я полагаю, что ваша проблема может быть решена с помощью ICompositeUserType реализации; Есть несколько ресурсов, доступных онлайн, о том, как их реализовать, в частности, универсальная реализация составного пользовательского типа . Вы бы просто отобразили свое свойство range как нормальное, но указали для него тип пользователя, используя CustomType.

Map(x => x.Range)
  .CustomType<RangeUserType>();

Вы также можете сделать это с недавно представленной функциональностью ComponentMap, но она не поддерживает отображение универсальных типов open без использования базовых классов.

Что-то вроде этого, вероятно, будет работать:

public abstract class RangeMap<T> : ComponentMap<T>
{
  protected RangeMap()
  {
    Map(x => x.Start);
    Map(x => x.Finish):
  }
}

public class IntRangeMap : RangeMap<int>
{}

public class DateRangeMap : RangeMap<DateTime>
{}

Правда, это не идеально.

...