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 );
}
}
Estoy teniendo un problema similar con Nhibernate 3.0GA y FluentNh (reconstruir con la última versión de NH). UserTypeConventions no se están registrando correctamente.
problema descrito aquí: http://groups.google.com/group/nhusers/browse_thread/thread/c48da661f78bfad0
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?