2010-07-16 6 views
13

Ho una classe di accesso ai dati con un Enum chiamato Titolo:Enum analisi non sembra funzionare con Fluent NHibernate

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

sto peristing la classe con NHibernate, e fino a questa mattina, stavo usando. File hbm.xml per il mapping. Tuttavia, ora ho passato a utilizzare Fluent NHibernate, ma le istanze di carico della classe viene a mancare con (per esempio):

[HibernateException: Impossibile analizzare il 5 come Saluto]

Come si può vedere, 5 dovrebbe essere analizzabile come un Salutation (supponendo che 5 sia un int, non è possibile distinguere dal messaggio di errore).

Qualcuno sa cosa sta succedendo qui?

Grazie

David

risposta

30

Questo è molto più facile di quanto pensassi.

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

Perché è così necessario? – svick

+0

In caso contrario, NHibernate supporrà che l'enum sia rappresentato nel database dal suo valore di stringa, piuttosto che dal suo valore int. – David

+1

Ah, OK. Sembra una strana scelta di default per me. – svick

1

Un'altra opzione sta usando, 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 
    } 
} 

Per utilizzare questa enumconvention:

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

E nel file di mapping,

Map(x => x.SomeEnumField);