2009-04-23 9 views
7

Wie ich diese Karte kann:Private collection Mapping in fließend nhibernate

public class Customer 
{ 
    private IList<Order> _orders; 
    public IEnumerable<Order> 
    GetAllOrders() 
    { 
     return _orders;  
    } 
} 

Auf der Projektseite sind einige Beispiele, aber keiner ist über diese Situation. Es gibt dieses Beispiel:

// model 
public class Account 
{ 
    private IList<Customer> customers = new List<Customer>(); 

    public IList<Customer> Customers 
    { 
    get { return customers; } 
    } 
} 

// mapping 
HasMany(x => x.Customers) 
    .Access.AsCamelCaseField(); 

Aber es setzt voraus, dass Konto öffentlichen Bereich Kunden hat und dieses Szenario ist anders als meine. Ich habe versucht, einige möglichen Optionen, aber keine funktioniert:

HasMany(x => Reveal.Propertie("_orders")) 

Privat Felder funktionieren in einfacher Eigenschaftszuordnung aber Sammlung Mapping ist ganz anders. Irgendeine Idee? Danke

Antwort

24

Die einfachste Lösung besteht darin, Ihre Sammlung als eine öffentliche Eigenschaft Orders statt der GetAllOrders() -Methode offen legen. Dann wird Ihr Mapping

HasMany(x => x.Orders) 
    .Access.AsCamelCaseField(Prefix.Underscore); 

ist und Ihre Klasse ist

public class Customer 
{ 
    private IList<Order> _orders = new List<Order>(); 

    public IEnumerable<Order> Orders 
    { 
     get { return _orders; } 
    } 
} 

Wenn das nicht für Sie arbeiten, ist es möglich, map private properties Mapping Reveal Fluent NHibernate verwenden.

Edited hinzufügen: dies gerade getan hat, ist die richtige Antwort:

HasMany<Order>(Reveal.Property<Customer>("_orders")) etc. 

Die Sammlung muss als geschütztes virtuelles Eigentum ausgesetzt werden, damit proxying: auf

protected virtual IList<Order> _orders { get; set; } 

This answer hat mich die richtige Spur.

1

Danke. Ihre Lösung ist in Ordnung. Es kann jedoch Situationen geben (hypothetisch), wenn Sie Ihre private Sammlung nicht preisgeben möchten. Dieses Zuordnungsszenario wird in Ihrem verknüpften Post nicht erläutert, da der Unterschied zwischen dem Zuordnen einfacher Eigenschaften, wie in diesem Post- und Auflistungszuordnung beschrieben, besteht. Mein Versuch, HasMany (x => Reveal.Properties ("_ orders")) zu verwenden, ist wegen einer ausgelösten Ausnahme fehlgeschlagen.

+3

hypothetische Situationen == YAGNI –

+1

In diesem Fall denke ich, dass Sie Ihre Collecti aussetzen können auf als geschützt statt öffentlich. –

1

Sie können eine völlig private Sammlung Karte Reveal.Member() verwenden, aber es hat eine spezifische und nicht-offensichtliche Einschränkung: die Expression dass HasMany() entweder IEnumerable<TReferenced> oder object zurücknimmt.

Für Ihre Klasse:

public class Customer 
{ 
    private IList<Order> _orders; 
    public IEnumerable<Order> GetAllOrders() 
    { 
     return _orders;  
    } 
} 

die folgende Zeile die _orders Sammlung bevölkern:

HasMany(Reveal.Member<Customer, IEnumerable<Order>>("_orders")); 
    //additional mapping behaviors 

Für Vollständigkeit - die folgende Zeile gibt einen Compiler-Fehler:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders")); 
Verwandte Themen