2011-03-21 20 views
23

के साथ इंट के रूप में मानचित्र Enum मैंने अतीत में मानचित्र के लिए यह How do you map an enum as an int value with fluent NHibernate? उपयोग किया था, लेकिन मैंने हाल ही में NHibernate 3 में अपग्रेड किया है और यह अब और काम नहीं कर रहा है। मैंने अपने एनम कन्वेंशन क्लास में ब्रेकपॉइंट्स लगाए हैं और उन्हें हिट नहीं किया जा रहा है। डेटाबेस को मारने वाली क्वेरी में स्ट्रिंग के रूप में enum है जो डिफ़ॉल्ट कॉन्फ़िगरेशन है।Fluent NHibernate और NHibernate 3

यह NHibernate 3 के साथ कैसे काम करता है?

अद्यतन

यहाँ मैपिंग फ़ाइल की बात यह है कि उत्पन्न किया जाता है:

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

यह सही है कि यह एक GenericEnumMapper का उपयोग करेंगे एक IUserTypeConvention enums के लिए निर्दिष्ट किया जाता है जब प्रतीत नहीं होता।

यहाँ मेरी सम्मेलन है:

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

मैं वास्तव में नहीं देखता कि आप इस अभ्यास से बाहर निकलने के लिए क्या खड़े हैं लेकिन इसे किसी कारण से हटा दिया गया है क्योंकि उन्हें इसे – Baz1nga

+0

के आसपास रखने की आवश्यकता मिलती है, मुझे कहीं भी यह नहीं पता कि यह दूर चला गया है, यह सिर्फ अब और काम नहीं कर रहा है। तब यह और कैसे किया जा सकता है? 'मानचित्र (...) करना। कस्टम टाइप () 'काम नहीं करता है। यह समस्या का कारण बनता है। मैं कस्टम IUserType करने का प्रयास करूंगा और देख सकता हूं कि यह अभी काम करता है या नहीं। –

+0

मैं कह रहा हूं कि आपके पास enum की बजाय int के रूप में इसे संग्रहीत करने का कोई कारण है? Mem nt a prob के साथ मैं वास्तव में कोई कारण नहीं देखता .. स्ट्रिंग enums कोड सुरक्षित हैं .. – Baz1nga

उत्तर

43

आप कर Map(m => m.MyEnum).CustomType<MyEnum>() अब ठीक से काम करने लगता है।

यदि कोई जानता है कि क्यों IUserTypeConvention NHibernate 3 में Fluent NHibernate के साथ काम नहीं करता है, तो भी मुझे यह जानना अच्छा लगेगा कि क्यों। शायद ऐसा इसलिए है क्योंकि एनम के लिए कस्टम प्रकार का मानचित्रण अब काम करता है, लेकिन फिर इसे lib से क्यों हटाया नहीं गया था?

+0

सरल समाधान ... मुझे इसने डीबग करने का एक टन बचाया! –

+0

पूरी तरह से काम किया, धन्यवाद! – vfilby

+0

यह समाधान मेरे लिए बेहतर काम करता है जो एक सम्मेलन को परिभाषित करने का प्रयास करता है। एक सम्मेलन का उपयोग करते हुए, प्रकार SQL Server 2014 तालिका पर अपेक्षित के रूप में सेट नहीं हो रहा था। – gopherr

1

मैं निबर्ननेट 3.0GA और फ्लुएंटएनएच (नवीनतम एनएच संस्करण के साथ पुनर्निर्माण) के साथ एक ही समस्या में भाग रहा हूं। UserTypeConventions ठीक से पंजीकृत नहीं हो रहे हैं।

समस्या यहाँ वर्णित: http://groups.google.com/group/nhusers/browse_thread/thread/c48da661f78bfad0

0

आप IUserTypeConvention से नहीं अपने सम्मेलन के वारिस चाहिए, लेकिन FluentNHibernate.Conventions.UserTypeConvention से।

/// <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>)) 
     ); 
    } 
} 

यह राष्ट्रीय राजमार्ग 3.3 और सुविज्ञ के पिछले संस्करण के साथ काम करता है:

उदाहरण के लिए, इस सटीक सम्मेलन मैं बुलाया UserTrueFalseType एक कस्टम प्रकार के बुलियन और नल बूलियन्स मैप करने के लिए इस्तेमाल करते हैं।