2010-04-23 10 views
8

Tengo las siguientes clases Person y Gender (realmente no, pero el ejemplo se simplifica para transmitir mi punto), utilizando NHibernate (Fluidez NHibernate) I desea asignar el valor de la columna de base de datos "GenderId" [INT] al campo int protegido _genderId en mi clase Person. ¿Cómo hago esto?Fluido NHibernate Mapa de campo privado/protegido que no tiene propiedad de exposición

Para su información, las asignaciones y los objetos de dominio están en ensamblajes separados.

public class Person : Entity 
{ 
    protected int _genderId; 

    public virtual int Id { get; private set; } 
    public virtual string Name { get; private set; } 

    public virtual Gender Gender 
    { 
     get { return Gender.FromId(_genderId); } 
    } 
} 

public class Gender : EnumerationBase<Gender> 
{ 
    public static Gender Male 
     = new Gender(1, "Male"); 

    public static Gender Female 
     = new Gender(2, "Female"); 

    private static readonly Gender[] _genders 
     = new[] { Male, Female }; 

    private Gender(int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public int Id { get; private set; } 
    public string Name { get; private set; } 

    public static Gender FromId(int id) 
    { 
     return _genders.Where(x => x.Id == id).SingleOrDefault(); 
    } 
} 
+0

He publicado un ejemplo completo aquí: http://stackoverflow.com/questions/5432380/using-fluent-nhibernate-is-there-anyway-to-have-a-private-property-mapped –

Respuesta

4

simplemente lo convierten en una propiedad protegida. La reflexión de NH no requiere propiedad pública.

protected virtual int _genderId { get; set; }

a continuación, asignar al igual que (lo siento nunca llegó a fluido) ...

<property name="_genderId" column="genderId" />

También, podría ser más fácil simplemente un mapa de la enumeración. Puede tener la columna almacenada como valor o texto Enum. Un montón de ejemplos de eso.

15

Como dijo dotjoe, creo que debe exponerlo como una propiedad protegida. Luego, puede acceder a él utilizando el mapeo Reveal.

Su clase/mapeo probablemente se verá algo en la línea de

public class Person : Entity 
{ 
    protected int genderId{ get; set; } 
} 


public PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Map(Reveal.Member<Person>("genderId")) 
    } 
} 

También hay preguntas similares here y here si eso ayuda.

+2

FYI para aquellos que llegan aquí vía Google: 'Reveal.Property' está en desuso. Use 'Reveal.Member' en su lugar. –

+0

@CharlieKilian: ¡Reparado, gracias! – R0MANARMY

2

Solo estoy usando nHibernate por primera vez, pero creo que no necesita crear una propiedad protegida para esto, solo tiene que especificar access = "field" en su mapeo y puede mapear directamente a el campo privado. P.ej.

<property name="_genderId" access="field" column="GenderId" type="Int32" /> 

De esta manera hay menos impacto en su capa de dominio.

Cuestiones relacionadas