2010-07-16 3 views
13

ich mit einer Enum genannt Anrede eine Datenzugriffsklasse zu arbeiten:Enum-Analyse scheint nicht mit Fluent NHibernate

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

ich die Klasse mit NHibernate bin peristing, und bis zu diesem Morgen war ich mit. hbm.xml-Dateien für die Zuordnung. Allerdings habe ich eingeschaltet jetzt Fluent NHibernate zu verwenden, aber das Laden Instanz der Klasse nicht mit (zum Beispiel):

[HibernateException: 5 nicht als Anrede parsen]

Wie Sie sehen können, 5 sollte als eine Anrede analysiert werden (angenommen, 5 ist ein int, ist es nicht möglich, von der Fehlermeldung zu unterscheiden).

Wer weiß, was hier vor sich geht?

Dank

David

Antwort

30

Das ist viel einfacher, als ich dachte.

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

Warum ist das nötig? – svick

+0

Sonst nimmt NHibernate an, dass die Enumeration in der Datenbank durch ihren String-Wert und nicht durch ihren int-Wert repräsentiert wird. – David

+1

Ah, OK. Das sieht für mich wie eine seltsame Wahl aus. – svick

1

Eine weitere Option verwendet, 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 
    } 
} 

dieses enumconvention zu benutzen:

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

Und in Mapping-Datei,

Map(x => x.SomeEnumField);