2011-07-27 11 views
17

मैं पेटापोको के साथ पीओसीओ में एक तालिका को बदलने के लिए प्रयोग कर रहा हूं।क्या पेटापोको संभालता है?

मेरी तालिका में, मुझे TheEnum नामक कॉलम मिला है।

public enum MyEnum 
{ 
    Fred, 
    Wilma 
} 

PetaPoco chokes जब यह एक MyEnum मूल्य में स्ट्रिंग "फ्रेड" कन्वर्ट करने के लिए कोशिश करता है: इस स्तंभ के मानों तार कि निम्नलिखित enum का प्रतिनिधित्व कर रहे हैं।

यह GetConverter विधि में यह करता है, लाइन में:

Convert.ChangeType(src, dstType, null); 

यहाँ, src "फ्रेड" (एक string) है, और dstTypetypeof(MyEnum) है।

अपवाद Invalid cast from 'System.String' to 'MyEnum'

कह मैं कुछ याद आ रही हूँ एक InvalidCastException है? क्या मुझे पहले पंजीकरण करने की ज़रूरत है?

मैं GetConverter विधि में निम्न को जोड़कर समस्या को हल मिल गया है:

if (dstType.IsEnum && srcType == typeof(string)) 
{ 
    converter = delegate(object src) 
      { 
       return Enum.Parse(dstType, (string)src) ; 
      } ; 
} 

जाहिर है, मैं नहीं चाहता कि प्रत्येक पंक्ति पर इस प्रतिनिधि को चलाने के लिए के रूप में यह बातें काफी धीमा करेंगे चाहते हैं। मैं चीजों को गति देने के लिए इस एनम और उसके मूल्यों को एक शब्दकोश में पंजीकृत कर सकता हूं, लेकिन ऐसा लगता है कि ऐसा कुछ भी उत्पाद में पहले से ही होगा।

तो, मेरा सवाल है, क्या मुझे पेटापोको के साथ अपने enums रजिस्टर करने के लिए कुछ भी करने की ज़रूरत है?

अद्यतन 23 वें फरवरी 2012

मैं submitted a patch थोड़ी देर पहले लेकिन यह अभी तक में खींच लिया नहीं किया गया है। यदि आप इसका उपयोग करना चाहते हैं, तो पैच को देखें और अपने कोड में विलय करें, या केवल from here कोड प्राप्त करें।

+0

** अपडेट जून 28, 2012 ** सटीक पैच अभी भी लागू नहीं किया गया है लेकिन इसी कोड को [v5 शाखा] (https://github.com/toptensoftware/PetaPoco/tree/v5) में जोड़ा गया है। यह भी देखें http://www.toptensoftware.com/Articles/137/Long-Time-No-Post-and-PetaPoco-v5 –

+0

यदि यह आपके लिए मुश्किल नहीं है, तो कृपया npoco को पैच सबमिट करें। मैं आपको npoco पर स्विच करने की सलाह देता हूं, क्योंकि इसमें अधिक सक्रिय विकास होता है और इसमें सभी सुविधाएं हैं जिन्हें पेटपाको के पास और भी बहुत कुछ है। – AuthorProxy

+0

** अपडेट 9 सितंबर, 2014 ** @iano उत्तर अंतिम ** 5.0.2 ** संस्करण के लिए सही है। –

उत्तर

5

आप सही हैं, हैंडलिंग enums PetaPoco में नहीं बनाया गया है और आमतौर पर मैं केवल वही कर रहा हूं जो आपने किया है।

ध्यान दें कि यह उन अनुरोधों के लिए चीजों को धीमा नहीं करेगा जो enum प्रकार का उपयोग नहीं करते हैं। पेटापोको पॉको को प्रतिक्रियाओं को मैप करने के लिए कोड उत्पन्न करता है ताकि प्रतिनिधि को केवल तभी आवश्यकता होगी जब वास्तव में आवश्यकता हो। दूसरे शब्दों में, GetConverter केवल पहली बार एक विशेष पोको प्रकार का उपयोग किया जाएगा, और प्रतिनिधि को केवल तभी बुलाया जाएगा जब एक enum रूपांतरण की आवश्यकता हो। Enum.Parse की गति पर निश्चित नहीं है, लेकिन हाँ, यदि आप बहुत धीमी हैं तो आप एक शब्दकोश में कैश कर सकते हैं।

+0

धन्यवाद ब्रैड। मैं enum लुकअप जोड़ और एक पैच जमा करेंगे। –

+0

27 दिसंबर, 2011 के अनुसार पैच लागू नहीं किया गया है। यह एक अच्छा जोड़ा होगा। – JCallico

+0

** अपडेट जून 28, 2012 ** सटीक पैच अभी भी लागू नहीं किया गया है लेकिन इसी कोड को [v5 शाखा] (https://github.com/toptensoftware/PetaPoco/tree/v5) में जोड़ा गया है। यह भी देखें http://www.toptensoftware.com/Articles/137/Long-Time-No-Post-and-PetaPoco-v5 –

5

मैं 4.0.3 का उपयोग कर रहा हूं और पेटापोको स्वचालित रूप से पूर्णांक और बैक में enums को परिवर्तित करता है। हालांकि, मैं अपने enums को तारों और पीछे में परिवर्तित करना चाहता था। Steve Dunn's EnumMapper और पेटापोको के IMapper का लाभ उठाते हुए, मैं इसके साथ आया। धन्यवाद दोस्तों।

ध्यान दें कि यह Nullable<TEnum> या डीबी में शून्य मानों को संभाल नहीं करता है। इसके इस्तेमाल के लिये PetaPoco.Database.Mapper = new MyMapper();

class MyMapper : PetaPoco.IMapper 
{ 
    static EnumMapper enumMapper = new EnumMapper(); 

    public void GetTableInfo(Type t, PetaPoco.TableInfo ti) 
    { 
     // pass-through implementation 
    } 

    public bool MapPropertyToColumn(System.Reflection.PropertyInfo pi, ref string columnName, ref bool resultColumn) 
    { 
     // pass-through implementation 
     return true; 
    } 

    public Func<object, object> GetFromDbConverter(System.Reflection.PropertyInfo pi, Type SourceType) 
    { 
     if (pi.PropertyType.IsEnum) 
     { 
      return dbObj => 
      { 
       string dbString = dbObj.ToString(); 
       return enumMapper.EnumFromString(pi.PropertyType, dbString); 
      }; 
     } 

     return null; 
    } 

    public Func<object, object> GetToDbConverter(Type SourceType) 
    { 
     if (SourceType.IsEnum) 
     { 
      return enumVal => 
      { 
       string enumString = enumMapper.StringFromEnum(enumVal); 
       return enumString; 
      }; 
     } 

     return null; 
    } 
} 
5

आप PetaPoco के टी -4 पीढ़ी का उपयोग कर रहे हैं, तो सेट और आप अपने उत्पन्न प्रकार में enums, आप डेटाबेस में PropertyType ओवरराइड का उपयोग कर सकते हैं।टीटी:

tables["App"]["Type"].PropertyType = "Full.Namespace.To.AppType"; 
+0

बहुत उपयोगी। धन्यवाद! –

0

मैं तुम्हें इंडेक्स नंबर (उदाहरण के लिए 1,2,4) आप PetaPoco कक्षा में अद्यतन समारोह पता लगा सकते हैं क्योंकि कोड "प्रबंधित" है आदि के बजाय enum का मूल्य संग्रहीत करना चाहते हैं , जब आप इसे nuget पैकेज के रूप में जोड़ते हैं तो यह आपके प्रोजेक्ट में .cs फ़ाइल को संग्रहीत करेगा।

// Store the parameter in the command 
AddParam(cmd, pc.GetValue(poco), pc.PropertyInfo); 

बदलने के लिए:

//enum? 
if (i.Value.PropertyInfo.PropertyType.IsEnum) 
{ 
     AddParam(cmd, i.Value.GetValue(poco).ToString(), i.Value.PropertyInfo); 
} 
else 
{ 
     // Store the parameter in the command 
     AddParam(cmd, i.Value.GetValue(poco), i.Value.PropertyInfo); 
} 

यह 2

के बजाय संग्रहीत करेंगे "पीले" हम enum चर रंग = {लाल, पीले, नीले}

बजाय होता तो

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