isessionfactory fluently descargar nhibernate fluent

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:

  1. FormStructure una propiedad llamada DisplayOrder a mi objeto FormStructure .

    public virtual int? DisplayOrder { get; set; }

  2. FormStructure método Join a mi clase de mapeo de FormStructure para que se FormStructure 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