2011-03-21 24 views
23

Utilicé este How do you map an enum as an int value with fluent NHibernate? como mapa, pero recientemente me actualicé a NHibernate 3 y parece que ya no funciona. He puesto puntos de interrupción en mi clase EnumConvention y no están siendo golpeados. La consulta que está golpeando la base de datos tiene la enumeración como una cadena que es la configuración predeterminada.Mapa Enum como Int con Fluidez NHibernate y NHibernate 3

¿Cómo funciona esto con NHibernate 3?

actualización

Aquí es parte del archivo de asignación 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 se estaría utilizando un GenericEnumMapper cuando se especifica una IUserTypeConvention para enumeraciones.

Aquí es 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); 
    } 
} 
+0

Realmente no veo lo que puede ganar con este ejercicio, pero esto podría haber sido eliminado por una razón, ya que no es necesario mantenerlo alrededor de – Baz1nga

+0

No veo en ningún lado que se haya ido, simplemente parece que ya no funciona ¿De qué otro modo se puede hacer esto entonces? Hacer 'Map (...) .CustomType ()' no funciona. Causa problemas. Trataré de hacer un IUserType personalizado y ver si eso funciona por ahora. –

+0

Estoy diciendo que tiene alguna razón para almacenarlo como un int en lugar de enum? Con mem nt a prob realmente no veo una razón ... cadenas enumeradas son código seguro .. – Baz1nga

Respuesta

43

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

Si alguien sabe por qué IUserTypeConvention no funciona con Fluent NHibernate en NHibernate 3, me gustaría saber por qué. Tal vez sea porque el mapeo del tipo personalizado a la enumeración funciona ahora, pero ¿por qué no fue eliminado de la lib entonces?

+0

Solución simple ... ¡me salvó un montón de tiempo depurando esto! –

+0

Funcionó perfectamente, gracias! – vfilby

+0

Esta solución funcionó mejor para mí que el intento de definir una convención. Utilizando una convención, el tipo no se estaba configurando en la tabla SQL Server 2014 como se esperaba. – gopherr

0

Usted debe heredar su convención no de IUserTypeConvention, pero a partir de FluentNHibernate.Conventions.UserTypeConvention.

Por ejemplo, esta es la convención exacta que uso para mapear booleanos booleanos y anulables 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 Fluido.

Cuestiones relacionadas