2011-02-02 22 views
10

यहां मेरी समस्या है। एक वर्ग है जो एक आदेश को परिभाषित करता है एक संपत्ति PaymentStatus कहा जाता है, जो एक enum इसलिए की तरह परिभाषित किया गया है: बाद मेंएज़ूर टेबल स्टोरेज, डब्ल्यूसीएफ सेवा और एनम

public enum PaymentStatuses : int 
    { 
     OnDelivery = 1, 
     Paid = 2, 
     Processed = 3, 
     Cleared = 4 
    } 

और, वर्ग अपने आप में, संपत्ति परिभाषा बहुत सरल है:

public PaymentStatuses? PaymentStatus { get; set; } 

System.InvalidOperationException: The type Order+PaymentStatuses' has no settable properties. 

इस बिंदु पर मैंने सोचा कि उसी: हालांकि, अगर मैं Azure तालिका भंडारण करने के लिए एक आदेश को बचाने की कोशिश, मैं निम्नलिखित अपवाद एनजी enum संभव नहीं है, लेकिन एक त्वरित गूगल खोज इस लौटे: http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/7eb1a2ca-6c1b-4440-b40e-012db98ccb0a

यह पृष्ठ दो जवाब, समस्याओं की अनदेखी करने और लगता है पता चलता है कि Azure संग्रहण में एक enum का उपयोग कर ठीक है, जिनमें से एक सूचीबद्ध करता है।

अब, मैं इस तरह के रूप Azure तालिका स्टोरेज में enum संग्रहीत करने की आवश्यकता नहीं है, मैं बस के रूप में अच्छी तरह से एक इसी int संग्रहीत कर सकती है, फिर भी, मैं इस संपत्ति WCF सेवा में उजागर होने की जरूरत है।

मैं एक संग्रहीत integer से enum लौटने के लिए, और मेरे DataContext पर WritingEntity घटना का उपयोग करके Azure से इस संपत्ति निकालने के लिए प्रॉपर्टी उपयोग get और set बनाने की कोशिश की है, लेकिन मैं इस इकाई के लिए घटना से पहले कि अपवाद निकाल दिया गया है

इस बिंदु पर, मुझे नुकसान हुआ है, मुझे नहीं पता कि मैं इस संपत्ति को enum के रूप में डब्ल्यूसीएफ में रखने के लिए और क्या कर सकता हूं, लेकिन Azure स्टोर केवल int है।

उत्तर

15

एनम समर्थित नहीं है। हालांकि यह एक int की तरह परिभाषित किया गया है, यह वास्तव में तालिका भंडारण द्वारा समर्थित एक अभिन्न प्रकार नहीं है। Here is the list of types supported. एक enum एक ऑब्जेक्ट उन्मुख स्वाद के साथ एक अभिन्न संख्या की एक स्ट्रिंग अभिव्यक्ति है।

आप तालिका भंडारण में int स्टोर कर सकते हैं और फिर Enum.Parse का उपयोग करके इसे गुप्त कर सकते हैं।

0

बस सुझाव ...

मुझे याद है WCF में आप विशेष विशेषताओं के साथ enums चिह्नित करने के लिए है: http://msdn.microsoft.com/en-us/library/aa347875.aspx

इसके अलावा, जब आप PaymentStatuses? PaymentStatus घोषित, आप Nullable<PaymentStatuses> PaymentStatus की घोषणा कर रहे हैं। ? सिंटैक्स सिर्फ वाक्य रचनात्मक चीनी है। ? को निकालने का प्रयास करें और देखें कि क्या होता है (आप एक भुगतानStatuses.NoSet = 0 जोड़ सकते हैं, क्योंकि Int32 के लिए डिफ़ॉल्ट मान 0 है)।

शुभकामनाएं।

+0

यह काम नहीं करता। मुझे डब्ल्यूसीएफ के साथ इस तरह की परेशानी नहीं है। यदि मैं डेटाकंट्रैक्ट बनाता हूं और इसमें एक enum परिभाषित करता हूं, तो यह ठीक काम करता है। मुझे एज़ूर स्टोरेज टेबल्स के साथ काम करने के लिए एनम के लिए क्या चाहिए। – Shaamaan

3

या तो मुझे यह समस्या हो रही थी मैंने अपनी संपत्ति को बदल दिया जो पहले int के लिए enum था।अब इस पूर्णांक संपत्ति भेजे पूर्णांक पार्स करके कोड था कि

public CompilerOutputTypes Type 
{get; set;} 

private CompilerOutputTypes type; 
public int Type 
{ 
    get {return (int)type;} 
    set { type = (CompilerOutputTypes)value; } 
} 
+1

मेरे मामले में यह एक वैध समाधान नहीं है: एक डब्ल्यूसीएफ सेवा जो enum का उपयोग करती है, अभी भी enums के बजाय पूर्णांक पर काम करने की आवश्यकता है। – Shaamaan

0

Parvs समाधान के लिए chaged है मुझे सही रास्ते पर डाल दिया तो अब एक ही enum प्रकार का एक variale में यह बचाता है लेकिन मेरे पास कुछ मामूली समायोजन थे।

private string _EnumType; 
private EnumType _Type; 

//********************************************* 
//********************************************* 
public string EnumType 
{ 
    get { return _Type.ToString(); } 
    set 
     { 
      _EnumType = value; 
      try 
      { 
       _Type = (EnumType)Enum.Parse(typeof(EnumType), value);  
      } 
      catch (Exception) 
      { 
       _EnumType = "Undefined"; 
       _Type = [mynamespace].EnumType.Undefined;     
      }       
     } 
    } 
11

यहाँ एक सरल समाधान का है:

public int MyEnumValue { get; set; } //for use by the Azure client libraries only 
[IgnoreProperty] public MyEnum MyEnum 
{ 
    get { return (MyEnum) MyEnumValue; } 
    set { MyEnumValue = (int) value; } 
} 

यह अच्छे हो गया होता यदि एक सरल समर्थन मूल्य एक अतिरिक्त (! सार्वजनिक) संपत्ति के बजाय नियोजित किया गया है सकते हैं - ReadEntity अधिभावी की परेशानी के बिना/बेशक WriteEntity। मैंने user voice ticket खोला जो इसकी सुविधा प्रदान करेगा, ताकि आप इसे ऊपर उठाना चाहें।

0

मैं एक समान समस्या में आया हूं और एक सामान्य ऑब्जेक्ट फ्लैटर/रीकंपोज़र एपीआई लागू किया है जो आपकी जटिल इकाइयों को फ्लैट EntityProperty शब्दकोशों में फ्लैट करेगा और उन्हें DynamicTableEntity के रूप में तालिका संग्रहण में लिखने योग्य बना देगा।

उसी एपीआई फिर DynamicTableEntity के EntityProperty शब्दकोश से संपूर्ण जटिल वस्तु को फिर से बदल देगा।

यह आपके प्रश्न के लिए प्रासंगिक है क्योंकि ObjectFlattenerRecomposer एपीआई संपत्ति प्रकार है कि सामान्य रूप से नहीं Enum, TimeSpan तरह Azure तालिका भंडारण करने के लिए लिखने योग्य हैं सपाट का समर्थन करता है, सभी Nullable प्रकार, ulong और uint उन्हें लिखने योग्य EntityProperties में परिवर्तित करके।

एपीआई भी रूपांतरण को मूल जटिल ऑब्जेक्ट पर फ़्लैटेड EntityProperty शब्दकोश से संभालता है। क्लाइंट को जो कुछ करना है वह एपीआई को बताना है, मेरे पास यह EntityProperty डिक्शनरी है जिसे मैंने अभी एज़ूर टेबल (डायनामिकटेबल एंटीटी.प्रॉपर्टीज के रूप में) से पढ़ा है, क्या आप इसे इस विशिष्ट प्रकार के ऑब्जेक्ट में बदल सकते हैं। एपीआई पूर्ण जटिल ऑब्जेक्ट को अपने सभी वास्तविक गुणों के साथ 'एनम' गुणों सहित सभी गुणों के साथ पुन: संकलित करेगा।

मूल वस्तु का यह फ़्लैटनिंग और पुनर्मूल्यांकन क्लाइंट (एपीआई के उपयोगकर्ता) के लिए पारदर्शी रूप से किया जाता है। क्लाइंट को ऑब्जेक्टफ्लैटनरकोम्पोज़र एपीआई को उस जटिल ऑब्जेक्ट के बारे में कोई स्कीमा या कोई ज्ञान प्रदान करने की आवश्यकता नहीं है, जिसे वह लिखना चाहता है, यह ऑब्जेक्ट को एपीआई को 'ऑब्जेक्ट' के रूप में फ़्लैट करने के लिए पास करता है। इसे वापस परिवर्तित करते समय, क्लाइंट को केवल वास्तविक प्रकार की ऑब्जेक्ट प्रदान करने की आवश्यकता होती है जो इसे EntityProperty शब्दकोश में कनवर्ट करने के लिए चाहता है। एपीआई की सामान्य कनवर्टबैक विधि बस टाइप टी की मूल वस्तु को पुन: संकलित करेगी और इसे क्लाइंट पर वापस कर देगी।

नीचे उपयोग उदाहरण देखें। ऑब्जेक्ट्स को किसी भी इंटरफ़ेस को 'ITableEntity' या किसी विशेष बेस क्लास से प्राप्त करने की आवश्यकता नहीं है। उन्हें रचनाकारों का एक विशेष सेट प्रदान करने की आवश्यकता नहीं है।

ब्लॉग:https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

Nuget पैकेज:https://www.nuget.org/packages/ObjectFlattenerRecomposer/

उपयोग:

//Flatten object (ie. of type Order) and convert it to EntityProperty Dictionary 
Dictionary<string, EntityProperty> flattenedProperties = EntityPropertyConverter.Flatten(order); 

// Create a DynamicTableEntity and set its PK and RK 
DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey); 
dynamicTableEntity.Properties = flattenedProperties; 

// Write the DynamicTableEntity to Azure Table Storage using client SDK 

//Read the entity back from AzureTableStorage as DynamicTableEntity using the same PK and RK 
DynamicTableEntity entity = [Read from Azure using the PK and RK]; 

//Convert the DynamicTableEntity back to original complex object. 
Order order = EntityPropertyConverter.ConvertBack<Order>(entity.Properties); 
संबंधित मुद्दे