2011-12-30 18 views
6

जेनिक्स का उपयोग करके इकाई फ्रेमवर्क में एम्स को प्रोसेस करने के लिए वर्कअराउंड बनाने की कोशिश कर रहा है, लेकिन ईएफ सामान्य गुणों की देखभाल नहीं करता है। उदाहरण के लिए:इकाई फ्रेमवर्क - आम तौर पर प्रचलित Enums?

public enum MyEnum 
{ 
    One, Two, Three 
} 

public class SomePOCOWithEnum 
{ 
     // I want this to persist as an int, but EF doesn't like generics. 
     public EnumWrapper<MyEnum> MyEnumProperty { get; set; } 
} 

इरादा डेटाबेस में एक आईएनटी के रूप में जारी रखना है। क्या धाराप्रवाह या शायद कुछ अन्य तंत्र विधि का उपयोग करने का कोई विशेष तरीका है जिससे मैं सामान्य वर्ग कह सकता हूं और क्या यह ईएफ के भीतर डेटाबेस में एक आईएनटी के रूप में जारी है?

इरादा बातें सामान्य रखने के लिए के रूप में मैं लगभग दो दर्जन enums कि बने जरूरत है, और मैं नहीं बल्कि उनमें से प्रत्येक के लिए अलग-अलग आवरण वर्गों लिख नहीं चाहते हैं। enum करने के लिए अंतर्निहित रूपांतरण, लेकिन दृढ़ता किसी पूर्णांक के रूप में:

public class EnumWrapper<T> where T : struct 
{ 
    private T enumValue; 
    public int Value 
    { 
     get { return Convert.ToInt32(enumValue); } 
     set { enumValue = (T)Enum.Parse(typeof(T), value.ToString()); } 
    } 

    public T EnumValue 
    { 
     get { return enumValue; } 
     set { enumValue = value; } 
    } 

    public static implicit operator T(EnumWrapper<T> wt) 
    { 
     return wt.EnumValue; 
    } 

    public static implicit operator EnumWrapper<T>(T t) 
    { 
     return new EnumWrapper<T>() { EnumValue = t }; 
    } 

    public override string ToString() 
    { 
     return enumValue.ToString(); 
    } 
} 
+0

क्यों आप enums लपेटकर कर रहे हैं? यह बहुत बोझिल लगता है। – phoog

+0

क्योंकि ईएफ enums जारी नहीं है। मैं ऐसा करने के किसी भी बेहतर तरीके से खुला हूं। –

+2

Enum समर्थित एफई 5 में जोड़ा गया है, ताकि आप [यह बाहर की जाँच] (http://msdn.microsoft.com/en-us/data/hh859576.aspx) – sinelaw

उत्तर

4

रूप sinelaw पहले ही बताया गया है, EF5 स्पष्ट समर्थन हासिल है

यहाँ सामान्य EnumWrapper वर्ग है, जो यह दर्शाता है मैं हासिल करना चाहते हैं क्या है Enums के लिए, लेकिन यदि आप किसी भी कारण से इसे माइग्रेट नहीं कर सकते हैं, तो मैंने जो दृष्टिकोण लिया है वह आपके लिए काम कर सकता है।

इस उदाहरण के लिए, मान तालिका "ईमेल" नाम दिया गया है और हम एक स्तंभ "प्राथमिकता" नाम डालते हैं। अपने कॉलम को एक int के रूप में सेट करें जैसा कि आप सामान्य रूप से करेंगे। इसके बाद, अपने संस्थाओं परियोजना में, अपने पूर्णांक मूल्यों के लिए एक enums वर्ग नक्शे है कि बनाने के लिए:

public enum EmailPriorityEnum 
{ 
    Now = 100, 
    Soon = 1000, 
    Whenever = 10000 
} 

अंत में, अपने संस्थाओं परियोजना में, तो अपनी इकाई मिलान एक आंशिक वर्ग फ़ाइल बना सकते हैं और मैन्युअल रूप से वहाँ enum नक्शा:

public partial class Email 
{ 
    public EmailEnums.EmailPriorityEnum EmailPriority 
    { 
     get { return (EmailEnums.EmailPriorityEnum)Priority; } 
     set { Priority = (int)value; } 
    } 
} 

वहाँ से, अपने कोड पारदर्शी रूप से इस संपत्ति को संदर्भित कर सकते। इस दृष्टिकोण के लिए प्राथमिक दोष हैं:

  1. आपको सावधान रहना होगा कि सभी संभावित मूल्यों को उचित आईडी के साथ enum में मैप किया गया है। उन परिवर्तनों के लिए जो अक्सर बदलते हैं, यह समस्याग्रस्त हो जाता है।
  2. डेवलपर्स के पास अभी भी अंतर्निहित कॉलम तक पहुंच होगी जबतक कि आप पहुंच को बदल नहीं सकते हैं और अनुमान लगा सकते हैं कि वे enums को बाईपास कर सकते हैं और जो भी मूल्य पसंद करते हैं उसका उपयोग कर सकते हैं।
+0

धन्यवाद हीथ कर सकते हैं। दुर्भाग्यवश, मैं प्रत्येक enum के लिए व्यक्तिगत गुणों और/या रैपर कक्षाओं को लिखने से बचने की कोशिश कर रहा हूं, क्योंकि मेरे पास लगभग दो दर्जन हैं। असल में, मैं सबसे कुशल समाधान खोजने की कोशिश कर रहा हूं जिसे सार्वभौमिक रूप से फिर से उपयोग किया जा सकता है, यदि ऐसा समाधान मौजूद है। एक सामान्य जेनेरिक वर्ग जिसे मैं उन सभी के लिए उपयोग कर सकता हूं वह आदर्श होगा, लेकिन यही वह जगह है जहां मैं फंस गया हूं। –

+0

बेशक, आप सही हैं कि ईएफ 5 में अपग्रेड करना सबसे सार्वभौमिक समाधान होगा, अगर मैं कर सकता हूं। :) –

संबंधित मुद्दे