2012-03-01 30 views
2

シリアライズしません。TableServiceContextは、私は次のようなデータ構造を持っているValueObjects

[DataServiceEntity] 
public class User 
{ 
    public string RowKey { get; set; } 
    public string PartitionKey { get; set; } 
    public DateTime Timestamp { get; set; } 

    public AddressValueObject Address { get; set; } 
} 

[DataServiceEntity] 
public class AddressValueObject 
{ 
    public string City { get; set; } 
    public string Street { get; set; } 
} 

は、今私はUserクラスの新しいインスタンスを作成し、以下の方法を使用して、Windows Azureテーブルストレージエミュレータにそれを永続化しようとしてるの:

void CreateAndSaveNewUser() 
{ 
    var userInstance = new User 
    { 
     RowKey = "SomeRowKey", 
     PartitionKey = "SomePartitionKey", 
     Address = new AddressValueObject 
     { 
      City = "SomeCity", 
      Street = "SomeStreet" 
     } 
    }; 

    var tableServiceContext = CloudStorageAccount 
           .DevelopmentStorageAccount 
           .CreateCloudTableClient() 
           .GetDataServiceContext(); 

    tableServiceContext.AddObject("UserTable", userInstance); 

    tableServiceContext.SaveChanges(); 
} 

問題はAddressValueObjectが正しくシリアル化されていないことです。 ストレージには、AddressValueObjectというemtpyという列が1つしかありません。

AddressValueObject_CityおよびAddressValueObject_Streetの列は作成されません。

私は間違っていますか?私はいくつかの属性が欠けていますか?

Azureテーブルストレージは参照されたValueObjectsをサポートしますか?

ありがとうございました。

答えて

3

単にこれを行うことはできません。テーブルストレージは単純な単純なテーブルであり、複合型はサポートしていません。したがって、関係や制約はサポートされていません。 回避策として、別のテーブルに格納されている関連オブジェクトのパーティションキーと行キーを格納することが考えられます。 リレーションを使用する場合は、SQL Azureが最適です。

2

Fabio Cozzolinoは正しいです。 Microsoft Azureテーブルストレージクライアントはシリアル化をサポートしていません。ただし、オブジェクトを手動でシリアル化し、XML文字列またはバイト[]として格納することはできます。

私は、すぐにシリアライズをサポートするクライアントを作成しました。私はまた、配列、列挙型、64Kより大きいデータのような多くの他の機能を含んでいます。 www.lucifure.comで確認したり、NuGet経由でLucifure Stashをダウンロードしたりすることができます。

0

私は、NugetにObjectFlattenerRecomposer APIを書いています。これは、Azure Table Storageとの間で複雑なオブジェクトの書き込みと読み取りを可能にします。

Nugetパッケージ:https://www.nuget.org/packages/ObjectFlattenerRecomposer/

ブログ:https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

APIを平坦化プロパティの辞書から、元の複雑なオブジェクトを再構成するためにEntityProperty辞書と機能に複雑なオブジェクトを平坦化する機能を提供します。 APIを使用すると、ネストされたプロパティを持つ複雑なオブジェクトを、Azure Storage Client SDKを使用することで通常は不可能な平坦化された形式のAzureテーブルストレージに書き込むことができます。

このAPIでは、Enum、TimeSpan、DateTimeOffset、NullableプロパティタイプをAzure Storage Storageに保存することもできます。これはAzure Storage Client SDKでは不可能です。

使用方法:ObjectFlattenerRecomposerを使用して

//オブジェクトを平らにし、EntityProperty辞書

辞書flattenedProperties = EntityPropertyConverterに変換します。Flatten(complexObject);

// DynamicTableEntityを作成し、そのPKとRK

DynamicTableEntity dynamicTableEntity =新しいDynamicTableEntity(のPartitionKey、のrowKey)を設定します。

dynamicTableEntity.Properties = flattenedProperties;

//クライアントSDKを使用してAzureテーブルストレージにDynamicTableEntityを書く

// DynamicTableEntityとしてPKを使用してのAzureから同じPKとRK

DynamicTableEntityエンティティ= [Readを使用してバックAzureTableStorageからエンティティを読みますおよびRK]。

// DynamicTableEntityを元の複合オブジェクトに戻します。

元のcomplexObjectはOrder型であったとします。

オーダーオーダー= EntityPropertyConverter.ConvertBack(entity.Properties);

関連する問題