Подтвердить что ты не робот

Сопоставление компонента внутри коллекции компонентов

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

nHibernate Exception:

 ----> 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 Mapping:

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");
        });
    });

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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