2015-04-30 6 views
11

Я пытаюсь сопоставить коллекцию объектов значений, где они содержат другие объекты значений, но я получаю следующее исключение.Сопоставление компонента внутри коллекции компонентов

NHibernate Исключение:

----> NHibernate.PropertyNotFoundException : Could not find a getter for property '_timeAtAddress' in class 'CustomerAddress' 

Домен:

public class CustomerAddress 
{ 
    private TimePeriod _timeAtAddress; 

    protected CustomerAddress() { } 

    public CustomerAddress(TimePeriod timeAtAddress) 
    { 
     _timeAtAddress = timeAtAddress; 
    } 

    public TimePeriod TimeAtAddress { get { return _timeAtAddress; } } 
} 

public class TimePeriod 
{ 
    private readonly int _months; 
    private readonly int _years; 

    protected TimePeriod() { } 

    public TimePeriod(int months, int years) 
    { 
     _months = months; 
     _years = years; 
    } 

    public int Months { get { return _months; } } 
    public int Years { get { return _years; } } 
} 

NHibernate карт:

contact.HasMany<CustomerAddress>(Reveal.Member<Contact>("_customerAddresses")) 
    .Schema(...) 
    .Table(...) 
    .KeyColumn(...) 
    .AsBag() 
    .Not.LazyLoad() 
    .Component(address => 
    { 
     . 
     . 
     . 

     address.Component(Reveal.Member<CustomerAddress, TimePeriod>("_timeAtAddress"), timeAtAddress => 
     { 
      timeAtAddress.Map(Reveal.Member<TimePeriod>("_years")).Column("TIME_YEARS"); 
      timeAtAddress.Map(Reveal.Member<TimePeriod>("_months")).Column("TIME_MONTHS"); 
     }); 
    }); 

Если бы д uick взгляните на Access, но не можете понять, где его настроить для компонентов. Вы можете помочь?

+0

Почему вы добавляете компонент в соотношение HasMany? Вы пробовали только вызывать ссылку на адрес? – Najera

+0

Не уверен, следую ли я, что бы вы там изменили? –

+0

Имейте в виду, что вам не нужно использовать метод 'Компонент' в отношении' HasMany', просто догадываясь, что вы должны добавить только ссылку на адрес. Просто попробуй. – Najera

ответ

1

Единственный способ, которым мне удалось двигаться вперед (с использованием частного поля), было установить глобальное соглашение Access.Field.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>() .Conventions.Add(DefaultAccess.Field()))

3

Вместо настройки FluentNHibernate установить частное поле, ты не должен рассказывать это использовать аргумент конструктора?

Мое шестое чувство, что ошибка здесь:

address.Component(Reveal.Member<CustomerAddress, TimePeriod>("_timeAtAddress") 

Где вы рассказываете его использовать поле _timeAtAddress.

+0

Не могли бы вы показать пример сопоставления, используя ctor, пожалуйста? –

Смежные вопросы