fluently - Cómo unirse a la mesa en nhibernate fluido
nhibernate documentation (2)
Lo que dijo Paco no está bien. Esto se puede hacer en Fluido NHibernate. Busqué en la web por un tiempo, no encontré a nadie hablando de esta opción, así que solo jugué un poco con FNHibernate y finalmente logré hacerlo.
Este fue mi escenario:
Tengo dos mesas -
"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; }
}
Tengo un par de métodos en mi consulta que devuelven una lista de objetos FormStructure
. Quería que estos métodos me los dieran ordenados por el campo DisplayOrder
en el objeto FormField
, y quería que el DisplayOrder
estuviera disponible como una propiedad en mi objeto FormStructure
por otras razones también.
Básicamente, esto significa que necesitaba unir las tablas para poder recuperar todas las columnas de la tabla FormStructure junto con la columna DisplayOrder
de la tabla FormField
, uniéndolas en las columnas FieldId
correspondientes.
Lo que hice para resolver esto:
FormStructure
una propiedad llamada DisplayOrder a mi objetoFormStructure
.public virtual int? DisplayOrder { get; set; }
FormStructure
métodoJoin
a mi clase de mapeo deFormStructure
para que seFormStructure
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 de unión obviamente se unirá entre las dos tablas en la columna que definió en el método KeyColumn dentro de la combinación.
Esto también eliminará algunas de las filas que tienen valores nulos. Para evitar esto (me encontré con esto recientemente) puedes agregar m.Optional();
dentro del método Join
.
Ahora podría recuperar una lista de objetos FormStructure
, ordenarlos por DisplayOrder
e incluso tener DisplayOrder
disponible como una propiedad en el objeto FormStructure
.
return session.CreateCriteria<FormStructure>()
.Add(Expression.Eq("FieldName", fieldName))
.AddOrder(Order.Asc("DisplayOrder"))
.List<FormStructure>();
Esto no podría haberse hecho antes, porque no habría reconocido la columna DisplayOrder
en la cláusula de orden que tengo allí.
¿Cómo hacemos este mapeo pero 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.
Por lo que sé, esto no es compatible con Fluent NHibernate, como muchas otras asignaciones específicas de bases de datos heredadas. Me temo que debe volver a hbm.xml o mezclar asignaciones fluidas con hbm.xml