धाराप्रवाह NHibernate के साथ एक आंतरिक मान के रूप में आप एक एनम कैसे मैप करते हैं?


88

सवाल यह सब वास्तव में कहते हैं, डिफ़ॉल्ट के रूप में यह नक्शे के लिए है, stringलेकिन मैं इसे एक के रूप में नक्शे की जरूरत है int

मैं वर्तमान में PersistenceModelअपने सम्मेलनों को सेट करने के लिए उपयोग कर रहा हूं अगर इससे कोई फर्क पड़ता है। अग्रिम में धन्यवाद।

अपडेट पाया गया कि ट्रंक से कोड के नवीनतम संस्करण पर प्राप्त करने से मेरी परेशानी हल हो गई।


5
यदि आपने स्वयं इस समस्या को हल किया है, तो आपको इसका उत्तर देना चाहिए, फिर इसे सही उत्तर के रूप में चिह्नित करें ताकि भविष्य के खोजकर्ता इसे ढूंढ लेंगे।
जेफ मार्टिन

क्या आप उत्तर पोस्ट कर सकते हैं?
21 दिसंबर को mxmissile

हो गया दोस्तों। विलंब के लिए क्षमा चाहते हैं। मुझे वास्तव में यकीन नहीं था कि मैं एक सवाल के साथ क्या करना चाहिए था जो एक गैर-प्रश्न से अधिक था क्योंकि मुझे पुस्तकालयों के नवीनतम संस्करण की आवश्यकता थी।
गैरी शट्लर

2
Google बॉट्स के लिए भोजन: मुझे अपनी एनम मैपिंग के लिए इसे लागू करने से पहले "लोडिंग संग्रह के लिए अवैध पहुंच" मिल रही थी।
4imble

जवाबों:


84

इस सम्मेलन को परिभाषित करने का तरीका कभी-कभी बदल गया है, यह अब है:

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

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

4
धाराप्रवाह nberberate के सबसे हाल के संस्करण के लिए यह सही उत्तर है
शॉन चैंबर्स

टक्कर। ^ ^ शॉन ने क्या कहा।
मार्टिन सुचैनक

1
ऐसा लगता है कि यह सभी एनम प्रकारों के लिए ठीक काम करता है, लेकिन क्या होगा यदि आप कुछ तार के रूप में चाहते हैं और कुछ स्याही के रूप में? मुझे लगता है कि यह संपत्ति मानचित्रण स्तर पर विन्यास योग्य होना चाहिए।
उपराष्ट्रपति

4
नीचे दिए गए उत्तर @SztupY द्वारा देखें कि यह अशक्त पहेली के लिए अनुमति देता है। stackoverflow.com/questions/439003/…
जॉन एडम्स 1

45

इसलिए, जैसा कि उल्लेख किया गया है, ट्रंक से धाराप्रवाह NHibernate का नवीनतम संस्करण प्राप्त करना मुझे वह स्थान मिला जहां मुझे होने की आवश्यकता थी। नवीनतम कोड के साथ एक एनम के लिए एक उदाहरण मैपिंग है:

Map(quote => quote.Status).CustomTypeIs(typeof(QuoteStatus));

कस्टम प्रकार इसे उपयोग करने के बजाय एनम के उदाहरण के रूप में नियंत्रित करने के लिए मजबूर करता है GenericEnumMapper<TEnum>

मैं वास्तव में एक थैली को बनाए रखने में सक्षम होने के लिए एक पैच को प्रस्तुत करने पर विचार कर रहा हूं जो एक स्ट्रिंग को बनाए रखता है और एक जो एक इंट को बनाए रखता है जो ऐसा लगता है जैसे आपको एक सम्मेलन के रूप में सेट करने में सक्षम होना चाहिए।


यह मेरी हाल की गतिविधि पर पॉप अप हुआ है और इस आसान को बनाने के लिए धाराप्रवाह NHibernate के नए संस्करणों में चीजें बदल गई हैं।

सभी एनमों को पूर्णांकों के रूप में मैप करने के लिए आप अब एक कन्वेंशन बना सकते हैं जैसे:

public class EnumConvention : IUserTypeConvention
{
    public bool Accept(IProperty target)
    {
        return target.PropertyType.IsEnum;
    }

    public void Apply(IProperty target)
    {
        target.CustomTypeIs(target.PropertyType);
    }

    public bool Accept(Type type)
    {
        return type.IsEnum;
    }
}

तब केवल आपकी मैपिंग होनी चाहिए:

Map(quote => quote.Status);

आप अपने धाराप्रवाह NHibernate मानचित्रण की तरह सम्मेलन को जोड़ते हैं;

Fluently.Configure(nHibConfig)
    .Mappings(mappingConfiguration =>
    {
        mappingConfiguration.FluentMappings
            .ConventionDiscovery.AddFromAssemblyOf<EnumConvention>();
    })
    ./* other configuration */

3
डिफ़ॉल्ट के रूप में "इंट मोड" के साथ। कौन एम्स को स्ट्रिंग्स के रूप में बनाए रखता है ?!
एंड्रयू बुलक

4
वहाँ पहले से ही वहाँ स्ट्रिंग मूल्यों के साथ एक विरासत डेटाबेस हो सकता है
क्रिस Haines

4
+1 हिंसी। @ एंड्रयू बुलॉक: आपके प्रश्न का उत्तर: जो कोई भी वास्तविक विश्व डेटाबेस से संबंधित है।
स्काई सैंडर्स

क्या FN में कोई IProperty इंटरफ़ेस है?
टीएन दो

40

Nullable enums (जैसे ExampleEnum? ExampleProperty) के बारे में मत भूलना ! उन्हें अलग से जांचने की आवश्यकता है। यह इस तरह से नए FNH शैली विन्यास के साथ किया जाता है:

public class EnumConvention : IUserTypeConvention
{
    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)
            );
    }

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

4
+1 इस जोड़ के लिए! पहला संस्करण अशक्त एनम के लिए काम नहीं करता है (वे तार के रूप में रहते हैं)।
longda

@SztupY डेटाबेस में कॉलम प्रकार है int? और जब प्रकार झंडे को स्वीकार करता है? जैसे:MyEnum.Active | MyEnum.Paused

: @RidermandeSousaBarbosa: झंडे के लिए यहां जाँच stackoverflow.com/questions/2805661/...
SztupY

25

इस तरह से मैंने एक एनम प्रॉपर्टी को एक इंट वैल्यू के साथ मैप किया है:

Map(x => x.Status).CustomType(typeof(Int32));

मेरे लिये कार्य करता है!


2
सबसे सरल उत्तर प्रदान करने के लिए धन्यवाद
माइक

इसके साथ मेरी एकमात्र योग्यता यह है कि आपको इसे हर एनम पर लागू करना याद रखना होगा। यही कन्वेंशन के लिए बनाए गए थे।
गैरी शॉटलर

यह पढ़ने के लिए काम करता है, लेकिन जब मैंने मापदंड क्वेरी की कोशिश की तो असफल रहा। एक कन्वेंशन की स्थापना (इस प्रश्न का उत्तर देखें) ने उन सभी मामलों में काम किया, जिन्हें मैंने कोशिश की थी।
थॉमस ब्राट सिप

वैसे मुझे लगा कि यह बहुत अच्छा है - लेकिन इससे समस्याएं पैदा होंगी: इस पोस्ट को देखें। nhforge.org/blogs/nhibernate/archive/2008/10/20/...
UpTheCreek

@UpTheCreek ऐसा लगता है कि यह ठीक कर दिया गया है और अब NH टीम से जेम्स ग्रेगोरी द्वारा सिफारिश की गई है: mail-archive.com/fluent-nhibernate@googlegroups.com/…
Ilya Kogan

1

स्वचालित (और संभवतः एक आईओसी कंटेनर के साथ) धाराप्रवाह NHibernate का उपयोग करने वालों के लिए:

IUserTypeConventionके रूप में @ है जुलिएन ऊपर के जवाब: https://stackoverflow.com/a/1706462/878612

public class EnumConvention : IUserTypeConvention
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Property.PropertyType.IsEnum);
    }

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

धाराप्रवाह NHibernate स्वचालित विन्यास इस तरह से कॉन्फ़िगर किया जा सकता है:

    protected virtual ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(SetupDatabase)
            .Mappings(mappingConfiguration =>
                {
                    mappingConfiguration.AutoMappings
                        .Add(CreateAutomappings);
                }
            ).BuildSessionFactory();
    }

    protected virtual IPersistenceConfigurer SetupDatabase()
    {
        return MsSqlConfiguration.MsSql2008.UseOuterJoin()
        .ConnectionString(x => 
             x.FromConnectionStringWithKey("AppDatabase")) // In Web.config
        .ShowSql();
    }

    protected static AutoPersistenceModel CreateAutomappings()
    {
        return AutoMap.AssemblyOf<ClassInAnAssemblyToBeMapped>(
            new EntityAutomapConfiguration())
            .Conventions.Setup(c =>
                {
                    // Other IUserTypeConvention classes here
                    c.Add<EnumConvention>();
                });
    }

* तब CreateSessionFactoryआईओसी में उपयोग किया जा सकता है जैसे कि कैसल विंडसर (एक PersistenceFacility और इंस्टॉलर का उपयोग करके) आसानी से। *

    Kernel.Register(
        Component.For<ISessionFactory>()
            .UsingFactoryMethod(() => CreateSessionFactory()),
            Component.For<ISession>()
            .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
            .LifestylePerWebRequest() 
    );

0

आप एक NHibernate बना सकते हैं IUserType, और इसे CustomTypeIs<T>()संपत्ति के नक्शे पर उपयोग करके निर्दिष्ट कर सकते हैं।


0

आपको अपनी DB तालिका में मानों को int / smallint के रूप में रखना चाहिए। अपने एनम की मैपिंग के लिए आपको सही तरीके से मैपिंग निर्दिष्ट करने की आवश्यकता है। कृपया नीचे मानचित्रण और एनम नमूना देखें,

मैपिंग क्लास

सार्वजनिक वर्ग का लेन-देन मानचित्र: कक्षा मानचित्र लेनदेन
{
    सार्वजनिक लेनदेन मानचित्र ()
    {
        // अन्य मैपिंग
        .....
        // एनम के लिए मैपिंग
        मानचित्र (x => x.Status, "Status")। CustomType ();

        तालिका ( "लेन-देन");
    }
}

enum

सार्वजनिक एनम ट्रांज़ैक्शनस्टैटस
{
   प्रतीक्षा = 1,
   संसाधित = 2,
   रोल्डबैक = 3,
   अवरुद्ध = 4,
   रिफंड किया गया = 5,
   पहले से ही तैयार = 6,
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.