2011-02-02 26 views
10

ここに私の問題があります。順序を定義するクラスは、プロパティは以下の様に定義されたenumである、PaymentStatus呼ばれています:Azureテーブルストレージ、WCFサービス、Enum

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

以降に、クラス自体に、プロパティ定義は非常に簡単です:

public PaymentStatuses? PaymentStatus { get; set; } 

私はUSI思った。この時点で

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

:私はAzureテーブルストレージに順序を保存しようとする場合は、私は次の例外を取得しますenum ngをすることはできませんが、迅速なGoogle検索は、この返さ:http://social.msdn.microsoft.com/Forums/en-US/windowsazure/thread/7eb1a2ca-6c1b-4440-b40e-012db98ccb0a

をこのページには、問題を無視しているようだとAzureストレージにenumを使用すると罰金であることを示唆しているそのうちの一つ2つの答えを、一覧表示されます。

Azureテーブルストレージにenumを格納する必要はありません。これに対応するintも保存することができますが、このプロパティをWCFサービスで公開する必要があります。

私が保存されintegerからenumを返し、私のDataContextWritingEntityイベントを使用してAzureのからこのプロパティを削除するには、プロパティの使用getsetを作ってみましたが、私はこのエンティティのためのイベントの前にその例外を取得解雇される。

この時点で、私は迷っています。私はenumとしてWCFでこのプロパティを持つために何ができるのか分かりませんが、Azureはちょうどintを持っています。

答えて

15

列挙型はサポートされていません。 intのように定義されていても、Table Storageでサポートされている整数型ではありません。 Here is the list of types supported. enumは、オブジェクト指向の味を持つ整数の文字列式です。

テーブルストレージにintを格納し、Enum.Parseを使用してintを変換することができます。

0

ちょうど...私はWCFには、特別な属性を持つ列挙型をマークしなければならないことを覚えておいてください

提案:あなたがPaymentStatuses? PaymentStatusを宣言するときhttp://msdn.microsoft.com/en-us/library/aa347875.aspx

はまた、あなたがNullable<PaymentStatuses> PaymentStatusを宣言しています。 ? sintaxは単なる構文的な砂糖です。 ?を削除して、Int32のデフォルト値が0なので、PaymentStatuses.NoSet = 0を追加することができます。

幸運。

+0

これは動作しません。私はWCF自体に問題はありません。 DataContractを作成し、その中に列挙型を定義すると、正常に動作します。 enumがAzure Storage Tablesで何とか動作する必要があるのです。 – Shaamaan

3

ya私はこの同じ問題を抱えていました 以前の列挙型のプロパティをintに変更しました。今、このint型のプロパティは、着信int型を解析し、今同じ列挙型のvarialeに

public CompilerOutputTypes Type 
{get; set;} 

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

私の場合、これは有効な解決策ではありません:enumを使用するWCFサービスは、enumではなく整数で操作する必要があります。 – Shaamaan

0

Parvs溶液にchagedされた右のトラックに私を置くのコードを保存します私は若干の調整を行った。

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をオーバーライドする手間をかけずに/:

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

ここでは簡単な回避策がありますもちろんWriteEntity。私はそれを促進するuser voice ticketを開いたので、あなたはそれをupvoteしたいかもしれません。

0

私は同様の問題を抱えており、複雑なエンティティを平らなEntityPropertyディクショナリにフラット化し、DynamicTableEntityの形式でテーブルストレージに書き込むことができる汎用オブジェクトフラットナー/リコンポーザAPIを実装しました。

同じAPIはDynamicTableEntityEntityProperty辞書から戻って複合オブジェクト全体を再構成します。

ObjectFlattenerRecomposerのAPIが書き込み可能EntityPropertiesにそれらを変換することによって、プロパティEnumTimeSpanのように通常Azureテーブルストレージに書き込み可能でないタイプの、すべてのNullable種類、ulonguintを平坦にサポートしているので、これはあなたの質問に関連しています。

APIはまた、平坦化されたEntityProperty辞書からの元の複合オブジェクトへの変換を処理します。クライアントが行う必要があるのは、この特定のタイプのオブジェクトに変換できるかどうかをAPIに伝えることです。このEntityPropertyディクショナリをちょうどAzureテーブルから読み込んで(DynamicTableEntity.Propertiesの形式で)読み込むことができます。 APIは、元の正しい値を持つ 'Enum'プロパティを含むすべてのプロパティを含む完全な複合オブジェクトを再構成します。

元のオブジェクトのこの平坦化と再構成はすべて、クライアント(APIのユーザー)に透過的に行われます。クライアントは、ObjectFlattenerRecomposer APIに書きたい複雑なオブジェクトに関するスキーマや知識を提供する必要はなく、オブジェクトをAPIに「オブジェクト」として渡してオブジェクトを平坦化します。それを元に戻すとき、クライアントはフラット化されたEntityPropertyディクショナリを変換することを望む実際のオブジェクトの型を提供するだけでよい。 APIの一般的なConvertBackメソッドは、単にタイプTの元のオブジェクトを再構成し、それをクライアントに返します。

以下の使用例を参照してください。オブジェクトは、 '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); 
関連する問題