2010-07-16 9 views
13

tengo una clase de acceso a datos con una enumeración denominada Tratamiento:Enumeración de análisis para trabajar con Fluido NHibernate

public enum Salutation 
    { 
    Unknown = 0, 
    Dame = 1, 
    etc 
    Mr = 5, 
    etc 
    } 

estoy peristing la clase con NHibernate, y hasta esta mañana que estaba usando. Archivos hbm.xml para mapeo. Sin embargo, ahora he pasado a utilizar Fluido NHibernate, pero los casos de carga de la clase falla con (por ejemplo):

[HibernateException: No se puede analizar como Tratamiento 5]

Como se puede ver, 5 debe poder analizarse como un saludo (suponiendo que 5 es un int, no es posible distinguirlo del mensaje de error).

¿Alguien sabe qué está pasando aquí?

Gracias

David

Respuesta

30

Esto es mucho más fácil de lo que pensaba.

Map(x => x.WhateverThePropertyNameIs).CustomType(typeof(MyEnumeration)); 
+0

¿Por qué es necesario? – svick

+0

De lo contrario, NHibernate supondrá que la enumeración se representa en la base de datos por su valor de cadena, en lugar de por su valor int. – David

+1

Ah, está bien. Parece una opción extraña para mí. – svick

1

Otra opción es usar, EnumConvention:

using System; 

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace TestApp 
{ 
    using FluentNHibernate.Conventions; 
    using FluentNHibernate.Conventions.AcceptanceCriteria; 
    using FluentNHibernate.Conventions.Inspections; 
    using FluentNHibernate.Conventions.Instances; 

    public class EnumConvention : 
     IPropertyConvention, 
     IPropertyConventionAcceptance 
    { 
     #region IPropertyConvention Members 

     public void Apply(IPropertyInstance instance) 
     { 
      instance.CustomType(instance.Property.PropertyType); 
     } 

     #endregion 

     #region IPropertyConventionAcceptance Members 

     public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
     { 
      criteria.Expect(x => x.Property.PropertyType.IsEnum || 
      (x.Property.PropertyType.IsGenericType && 
      x.Property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) && 
      x.Property.PropertyType.GetGenericArguments()[0].IsEnum) 
      ); 
     } 

     #endregion 
    } 
} 

Para utilizar esta enumconvention:

... 
var fluentCfg = Fluently.Configure().Database(cfg).Mappings(
        m => m.FluentMappings.AddFromAssemblyOf<SomeObjectMap>().Conventions.Add<EnumConvention>()); 
... 

Y en archivo de asignación,

Map(x => x.SomeEnumField); 
Cuestiones relacionadas