nhibernate fluent-nhibernate nhibernate-mapping

download fluent nhibernate dll



Mapa Enum como Int con Fluido NHibernate y NHibernate 3 (3)

Debe heredar su convención no de IUserTypeConvention, sino de FluentNHibernate.Conventions.UserTypeConvention.

Por ejemplo, esta es la convención exacta que utilizo para asignar valores booleanos y booleanos que admiten nulos a un tipo personalizado llamado UserTrueFalseType :

/// <summary> /// Convention: Boolean fields map to CHAR(1) T/F/Null /// </summary> public class BooleanTrueFalseConvention : FluentNHibernate.Conventions.UserTypeConvention<UserTrueFalseType> { /// <summary> /// Accept field type criteria /// </summary> /// <param name="criteria"></param> public override void Accept(FluentNHibernate.Conventions.AcceptanceCriteria.IAcceptanceCriteria<FluentNHibernate.Conventions.Inspections.IPropertyInspector> criteria) { criteria.Expect(instance => instance.Property.PropertyType.Equals(typeof(System.Boolean)) || instance.Property.PropertyType.Equals(typeof(System.Nullable<System.Boolean>)) ); } }

Esto funciona con NH 3.3 y la última versión de Fluent.

Utilicé esto ¿Cómo se asigna una enumeración como valor int con un NHibernate fluido? para mapear en el pasado, pero recientemente he actualizado a NHibernate 3 y esto parece que ya no funciona. He puesto puntos de interrupción en mi clase EnumConvention y no están siendo alcanzados. La consulta que está llegando a la base de datos tiene la enumeración como una cadena que es la configuración predeterminada.

¿Cómo funciona esto con NHibernate 3?

Actualizar

Aquí es parte del archivo de mapeo que se genera:

<property name="ComponentType" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[...ComponentType, ..., Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.1.0.0, Culture=neutral, PublicKeyToken=8aa435e3cb308880"> <column name="ComponentTypeId" /> </property>

No parece correcto que utilice un GenericEnumMapper cuando se especifica una IUserTypeConvention para las enumeraciones.

Aquí está mi convención:

public class EnumConvention : IUserTypeConvention { public void Accept( IAcceptanceCriteria<IPropertyInspector> criteria ) { criteria.Expect( e => e.Property.PropertyType.IsEnum ); } public void Apply( IPropertyInstance instance ) { instance.CustomType( instance.Property.PropertyType ); } }



Simplemente haciendo Map( m => m.MyEnum ).CustomType<MyEnum>() parece funcionar bien ahora.

Si alguien sabe por qué IUserTypeConvention no funciona con IUserTypeConvention NHibernate en NHibernate 3, todavía me gustaría saber por qué. Tal vez sea porque la asignación del tipo personalizado a la enumeración ahora funciona, pero ¿por qué no se eliminó de la biblioteca?