2009-03-23 23 views
15

निम्नलिखित Enum करें ले लोमानचित्रण

[Flags] 
enum Permssions 
{ 
    CanComment = 1, 
    CanEdit = 2, 
    CanDelete = 4, 
    CanRemoveUsers = 8, 
    All = CanComment | CanEdit | CanDelete | CanRemoveUsers 
} 

NHibernate में मैं उपयोग करने से पहले एक enum को मैप किया है

<property type="n.Permssions, n.Permssions" 
name="Permssions" column="Permssions"></property> 

मेरा प्रश्न है, मैं कैसे एक मैप करते NHibnerate का उपयोग कर ध्वज क्षेत्र में bitwise फ़ील्ड?

उत्तर

2

मुझे लगता है कि इसके लिए सबसे अच्छा विकल्प Custom User Type का उपयोग करना होगा। जिसमें आप अपने वर्ग में एनम को उन दो स्तंभों में मैप कर सकते हैं।

हालांकि आपके मामले में, बस को लागू करने IUserType पर्याप्त सकता है: यहाँ जो एक गाइड के रूप में इस्तेमाल किया जा सकता है ICompositeUserMap का उपयोग करने का एक उदाहरण है।

+0

कस्टम उपयोगकर्ता प्रकार की आवश्यकता नहीं है - NHibernate जानता है कि enum ध्वज को कैसे संभालना है। शीर्ष जवाब पर एक नज़र डालें। –

0

यही आपके प्रश्न का उत्तर नहीं है, लेकिन यह अपने वर्ग और मानचित्रण में कोई Int32 संपत्ति का उपयोग करने के लिए, और कोड में मानों का प्रबंधन कैसे इस तरह स्थिरांक की एक स्थिर वर्ग का उपयोग आसान हो सकता है:

public static class Permissions 
{ 
    public const int CanComment = 0x1; 
    public const int CanEdit = 0x2; 
    public const int CanDelete = 0x4; 
    public const int CanRemoveUsers = 0x8; 
    public const int All = CanComment | CanEdit | CanDelete | CanRemoveUsers; 
} 

मुझे पता है कि यह आदर्श नहीं है, क्योंकि यह आपके उपयोगकर्ताओं को निश्चित enum मानों तक सीमित नहीं करता है, और आपको कोड में कच्चे इनट से निपटने के लिए मजबूर करता है, लेकिन मुझे लगता है कि हाइबरनेट को थोड़ा सा enum के साथ परेशानी होगी। यह डेटाबेस में किसी मान को एक विशिष्ट एनम मान पर मैप करने का प्रयास करेगा। यदि यह डेटाबेस में एक मान पाता है जिसे आपने स्पष्ट रूप से समझा नहीं है तो शायद यह चकित होगा। जैसे यदि यह डेटाबेस में "3" पाता है, तो यह इसे वापस enum मान पर मैप करने में सक्षम नहीं होगा, जब तक कि आप CanCommentAndEdit, CanCommentAndEditAndDelete, आदि जैसे प्रत्येक संयोजन को स्पष्ट रूप से गणना नहीं कर लेते हैं। यह शायद bitwise enum का उपयोग करने के उद्देश्य को हरा देता है ।

0

मेरे पास एनएचबर्ननेट दृढ़ता और ध्वज enum के लिए एक सार्वजनिक गेटटर/सेटर संपत्ति के लिए एक निजी int फ़ील्ड होगा जो int फ़ील्ड को पढ़ और लिखता है। (एनएचबेर्नेट को निजी क्षेत्रों के साथ काम करने के लिए कॉन्फ़िगर किया जा सकता है)

इस तरह आपको नौकरी पाने के लिए वूडू जादू या गन्दा स्थिरांक का सहारा लेने की आवश्यकता नहीं है।

9

जब मैं एक enum मैप करता हूं, और इस enum में 'int' प्रकार का बैकिंग मान होता है, तो मैं बस डेटाबेस में एक int फ़ील्ड में अपनी enum संपत्ति को मैप करता हूं। मैंने इसके लिए समस्याओं में भाग नहीं लिया है।
मैंने इसे ध्वज enums के लिए भी किया है, और यह बिना किसी समस्या के काम करता है। जब आप कुछ झंडे गठबंधन करते हैं, तो NHibernate डेटाबेस में निर्दिष्ट कॉलम में उन झंडे के 'संयोजन' को बनाए रखेगा।
जब आप उस उदाहरण को पुनर्प्राप्त करते हैं जिसमें 'ध्वज enums' की संपत्ति है, तो NHibernate इसे सही संयोजन पर वापस स्थापित करेगा।
उदाहरण के लिए, यदि डीबी में '3' है, तो NHibernate अनुचित मानों के संयोजन के साथ आपकी संपत्ति को पॉप्युलेट करेगा।
वास्तव में, मैं NHibernate खुद ही यह पता लगा है:

<property name="OnCallType" column="OnCallType" /> 

जहां OnCallType स्तंभ मेरी DB में प्रकार int की है, और OnCallType संपत्ति एक enumerated प्रकार है कि झंडे का श्रेय है।

+0

ghosting nhibernate के बारे में क्या ?? – giammin

1

यह मेरे लिए समस्या हल:

वर्ग मानचित्रण मैं enum प्रकार नाम के साथ एक कस्टम प्रकार के लिए यह Maped में।

Map(x => x.MyEnumProperty).CustomType<EnumType>(); 
संबंधित मुद्दे