2009-08-06 13 views
20

¿cómo hacemos this mapping pero con fluidez?Cómo unirse a la tabla en nhibernate con fluidez

<class name="Person" table="People"> 

    <id name="Id"> 
     <generator class="identity"/> 
    </id> 

    <property name="Name" /> 

    <join table="Addresses"> 
     <key column="PersonId"/> 
     <property name="Line1"/> 
     <property name="Line2"/> 
     <property name="City"/> 
     <property name="Country"/> 
     <property name="ZipCode"/> 
    </join> 

</class> 

Sé que puedo usar 'Referencias' pero no necesito todas las columnas de la tabla relacionada. solo necesito una propiedad.

Respuesta

24

Lo que Paco dijo no es correcto. Esto se puede hacer en Fluent NHibernate. Busqué en la web por un tiempo, no pude encontrar a nadie hablando sobre esta opción, así que solo jugué un poco con FNHibernate y finalmente logré hacerlo.

Esta era mi escenario:

Tengo dos tablas -

"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" } 
"FormStructure" => Columns { "FormId", "FormType", "FieldId" } 

Estas fueron mis Entidades:

public class FormStructure 
{ 
    public virtual Int32 FormId { get; private set; } 
    public virtual Int32 FormType { get; set; } 
    public virtual FormField FieldId { get; set; } 
} 

public class FormField 
{ 
    public virtual int FieldId { get; private set; } 
    public virtual String FieldName { get; set; } 
    public virtual int? FieldType { get; set; } 
    public virtual int? DisplayOrder { get; set; } 
} 

que tengo un par de métodos en mi consulta que devuelve una lista de FormStructure objetos. Quería que estos métodos me los dieran ordenados por el campo DisplayOrder en el objeto FormField, y quería el DisplayOrder disponible como una propiedad en mi objeto FormStructure por otras razones también.

Esto significa básicamente que necesitaba para unir las tablas de modo que iba a recuperar todas las columnas de la tabla FormStructure junto con la columna de DisplayOrder de la mesa FormField, uniéndose a ellos en los que emparejan FieldId columnas.

Lo que hice para resolver esto:

  1. que añade una propiedad llamada a mi DisplayOrder objeto FormStructure.

    public virtual int? DisplayOrder { get; set; } 
    
  2. he añadido el método Join a mi clase de mapeo FormStructure por lo que se veía así.

    public class FormStructureMap : ClassMap<FormStructure> 
    { 
        public FormStructureMap() 
        { 
         Table("FormStructure"); 
    
         Id(x => x.Id); 
         Map(x => x.FormType); 
         References(x => x.Schedule).Column("ScheduleId"); 
         References(x => x.Field).Column("FieldId"); 
         Map(x => x.IsMandatory).Nullable(); 
    
         Join("FormFields", m => 
         { 
          m.Fetch.Join(); 
          m.KeyColumn("FieldId"); 
          m.Map(t => t.DisplayOrder).Nullable(); 
         }); 
        } 
    } 
    

El método Join obviamente unión entre las dos mesas en la columna que definió en el método KeyColumn dentro de la unión.

Esto también eliminará algunas de las filas que tienen valores nulos. Para evitar esto (me encontré con esto recientemente) puede agregar m.Optional(); dentro del método Join.

ahora podía recuperar una lista de FormStructure objetos, ordenarlos por DisplayOrder e incluso tienen DisplayOrder disponible como una propiedad del objeto FormStructure.

return session.CreateCriteria<FormStructure>() 
       .Add(Expression.Eq("FieldName", fieldName)) 
       .AddOrder(Order.Asc("DisplayOrder")) 
       .List<FormStructure>(); 

Esto no se podría haber hecho antes, porque no habría reconocido la columna de la DisplayOrder en la cláusula Solicitar tengo allí.

+0

Interesante, sin embargo, la documentación sobre el método Join() con una asignación de Subclase dice que para el segundo argumento de Acción unirse() -> "esto solo funciona si estás en una estrategia de jerarquía de tabla por herencia. – PandaWood

0

Hasta donde yo sé, esto no es compatible con Fluent NHibernate, como muchas otras asignaciones de bases de datos heredadas. Me temo que tiene que volver a cambiar a hbm.xml o mezclar mapeos con fluidez con hbm.xml

+0

Me encontré con el mismo problema exacto. Ya he mapeado todas mis tablas con fluidez, y necesito agregar solo una columna en una combinación, como se muestra en el enlace. ¿Cómo puedo mezclar mis asignaciones fluidas con solo esta adición en mapeos xml? – gillyb

Cuestiones relacionadas