2009-04-23 14 views
7

Jak mogę na mapie:prywatna kolekcja w mapowanie Fluent NHibernate

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

Na stronie projektu są jakieś próbki, ale żaden nie jest o tej sytuacji. Jest to próbka:

// 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(); 

Ale to zakłada, że ​​konto ma klientów pól publicznych i że scenariusz jest inny jak mój. Próbowałem kilka możliwych opcji, ale żaden działa:

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

pól prywatnych działa dobrze w prosty mapowania własności ale mapowanie kolekcja jest zupełnie inna. Dowolny pomysł? Dzięki

Odpowiedz

24

Najprostszym rozwiązaniem jest ujawnienie kolekcji jako zamówienia publicznego Zamówienia zamiast metody GetAllOrders(). Wówczas odwzorowanie jest

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

a klasa jest

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

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

Jeśli to nie zadziała, to jest możliwe map private properties użyciu Reveal mapowanie Fluent NHibernate za.

Edited by dodać: Po prostu zrobić to, prawidłowa odpowiedź brzmi:

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

Kolekcja musi być wystawiony jako chronione wirtualne nieruchomości, aby umożliwić proxy:

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

This answer umieścić mnie na właściwy tor.

1

Dzięki. Twoje rozwiązanie jest w porządku. Jednak mogą wystąpić sytuacje (hipotetyczne), gdy nie chcesz ujawnić swojej prywatnej kolekcji. Ten scenariusz mapowania nie jest wyjaśniony w twoim połączonym wpisie, ponieważ istnieje różnica między odwzorowaniem prostego właściwości opisanego w tym opisie pocztowym i mapowaniem kolekcji. Moja próba użycia HasMany (x => Reveal.Propertie ("_ orders")) nie powiodła się z powodu podniesionego wyjątku.

+3

hipotetyczne sytuacje == YAGNI –

+1

W takim przypadku, myślę, że możesz narazić swoje kolekcje jako chronione zamiast publiczne. –

1

można zmapować całkowicie prywatną kolekcję używając Reveal.Member(), ale ma specyficzny i nieoczywiste ograniczenie: the Expression że HasMany() akceptuje musi powrócić albo IEnumerable<TReferenced> lub object.

Na swojej klasie:

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

następujący wiersz będzie zapełnić _orders kolekcję:

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

Dla kompletności - dodaje się wiersz daje błąd kompilatora:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders")); 
Powiązane problemy