2009-04-23 17 views
7

¿Cómo puedo asignar este:mapeo de la colección privada de nhibernate fluidez

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

En la página del proyecto son algunas muestras, pero ninguno es de esta situación. Hay esta muestra:

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

Pero asume que la cuenta tiene clientes de campo públicas y que el escenario es diferente que la mía. Probé algunas opciones posibles, pero ninguno funciona:

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

campos privados funciona bien en la asignación de propiedad simple pero mapeo de la colección es bastante diferente. ¿Alguna idea? Gracias

Respuesta

24

La solución más fácil es exponer su colección como una propiedad pública Pedidos en lugar del método GetAllOrders(). Luego, su asignación es

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

y su clase es

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

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

Si eso no funciona para usted, es posible utilizar map private properties Reveal mapeo de Fluent NHibernate.

Editado para agregar: Habiendo hecho esto, la respuesta correcta es:

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

La colección debe ser expuesto como una propiedad virtual protegida para permitir proxy:

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

This answer me puso en el camino correcto

1

Gracias. Su solución está bien. Sin embargo, podría haber situaciones (hipotéticas) cuando no desea revelar su colección privada. Este escenario de asignación no se explica en su publicación vinculada porque existe una diferencia entre la asignación de propiedad simple como se describe en esa publicación y la asignación de la colección. Mi intento de utilizar HasMany (x => Reveal.Propertie ("_ pedidos")) falló debido a la excepción planteada.

+3

situaciones hipotéticas == YAGNI –

+1

En ese caso, creo que puede exponer su collecti como protegido en lugar de público. –

1

puede asignar una colección completamente privada utilizando Reveal.Member(), pero tiene una restricción específica y no evidente: el Expression que acepta HasMany() tiene que regresar ya sea IEnumerable<TReferenced> o object.

para su clase:

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

la siguiente línea se rellenará la colección _orders:

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

Para completar - la línea siguiente da un error del compilador:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders")); 
Cuestiones relacionadas