2010-07-16 17 views
13

मैं एक Enum बुलाया अभिवादन के साथ एक डेटा का उपयोग वर्ग के साथ काम करने के लिए प्रतीत नहीं होता:Enum पार्स धाराप्रवाह NHibernate

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

मैं NHibernate के साथ वर्ग peristing रहा हूँ, और ऊपर आज सुबह जब तक मैं उपयोग कर रहा था। मानचित्रण के लिए hbm.xml फ़ाइलें। हालांकि, मैं अब धाराप्रवाह NHibernate का उपयोग कर अपना ली है, लेकिन वर्ग की लोडिंग उदाहरणों (उदाहरण के लिए) के साथ विफल रहता है:

:

आप देख सकते हैं, 5 [HibernateException अभिवादन के रूप में 5 पार्स नहीं कर सकता] एक अभिवादन के रूप में पारदर्शी होना चाहिए (माना जाता है कि 5 एक int है, त्रुटि संदेश से बताना संभव नहीं है)।

कोई भी जानता है कि यहां क्या हो रहा है?

धन्यवाद

डेविड

उत्तर

30

यह बहुत आसान है की तुलना में मैंने सोचा है।

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

क्यों कि आवश्यक है:

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 } } 

इस enumconvention उपयोग करने के लिए? – svick

+0

अन्यथा NHibernate यह मान लेगा कि enum को इसके int मान के बजाय डेटाबेस में इसके स्ट्रिंग मान द्वारा दर्शाया गया है। – David

+1

आह, ठीक है। यह मेरे लिए डिफ़ॉल्ट की एक अजीब पसंद की तरह दिखता है। – svick

1

एक अन्य विकल्प उपयोग कर रहा है, EnumConvention:

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

और मैपिंग फ़ाइल में,

Map(x => x.SomeEnumField); 
संबंधित मुद्दे