2009-04-23 6 views
7

Comment puis-je mapper ce:cartographie collection privée NHibernate couramment

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

Sur la page du projet sont quelques exemples, mais aucun est cette situation. Il y a cet exemple:

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

Mais il suppose que le compte a Champ public Les clients et ce scénario est différent que le mien. J'ai essayé quelques options possibles mais aucun travaux:

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

champs privés fonctionne très bien dans un langage simple cartographie de la propriété, mais la cartographie de collection est tout à fait différente. Une idée? Merci

Répondre

24

La solution la plus simple consiste à exposer votre collection en tant qu'ordres de propriété publique au lieu de la méthode GetAllOrders(). Ensuite, votre cartographie est

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

et votre classe est

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

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

Si cela ne fonctionne pas pour vous, il est possible de map private properties en utilisant la cartographie Reveal Fluent NHibernate.

Modifié ajouter: Je viens de faire cela, la bonne réponse est:

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

La collection doit être exposée comme une propriété virtuelle protégée pour permettre le mandatement:

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

This answer m'a mis sur la bonne voie.

1

Merci. Votre solution est correcte. Cependant, il pourrait y avoir des situations (hypotétiques) lorsque vous ne voulez pas révéler votre collection privée. Ce scénario de mappage n'est pas expliqué dans votre article lié car il existe une différence entre la mappage d'une propriété simple telle que décrite dans ce post et le mappage de collection. Ma tentative d'utiliser HasMany (x => Reveal.Propertie ("_ orders")) a échoué en raison d'une exception déclenchée.

+3

situations hypothétiques == YAGNI –

+1

Dans ce cas, je pense que vous pouvez exposer votre collection sur comme protégé au lieu de public. –

1

Vous pouvez mapper une collection entièrement privée en utilisant Reveal.Member(), mais il a une restriction spécifique et non évidente: le Expression que HasMany() accepte doit retourner soit IEnumerable<TReferenced> ou object.

Pour votre classe:

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

la ligne suivante remplira la collection _orders:

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

Pour être complet - la ligne suivante donne une erreur de compilation:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders")); 
Questions connexes