2015-04-30 9 views
11

Sto tentando di mappare una raccolta di oggetti valore dove questi contengono altri oggetti valore ma ottengono l'eccezione sottostante.Mappatura di un componente all'interno di una raccolta di componenti

NHibernate eccezione:

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

Domain:

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

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

Aveva un q guarda attentamente Access ma non riesci a capire dove metterlo per i componenti. Puoi aiutare?

+0

Perché stai aggiungendo il componente nella relazione HasMany? Hai provato a chiamare solo un riferimento a un indirizzo? – Najera

+0

Non so se seguo, cosa cambieresti lì? –

+0

Supponendo che non sia necessario utilizzare il metodo 'Component' nella relazione' HasMany', supponiamo solo di dover aggiungere solo il riferimento all'indirizzo. Basta fare un tentativo. – Najera

risposta

1

L'unico modo in cui sono riuscito ad andare avanti (utilizzando il campo privato) era impostare una convenzione globale Access.Field.

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

3

Invece di configurare FluentNHibernate per impostare il campo privato, non dovrebbe essere dicendo che utilizzare l'argomento del costruttore?

La mia sensazione è che l'errore è qui:

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

dove si sta dicendogli di utilizzare il campo _timeAtAddress.

+0

Puoi mostrare un esempio di mappatura usando il ctor per favore? –

Problemi correlati