2012-07-06 8 views
5

Azureテーブルストレージに保存するTimeSpanプロパティを持つエンティティがあります。私は、エンティティを保存しようとすると、私はエラーを取得する:AzureテーブルストレージのTimeSpanプロパティ

Can't cast to unsupported type 'TimeSpan'

は自動変換やTimeSpanをサポートするためにいくつかの他の方法を行うには、いくつかの方法はありますか?

答えて

3

私は、TimeSpanをティックとしてintまたはbigintフィールドに格納して変換します。それをvarcharとして保存することもできます。私はティックが好きです。なぜなら、必要に応じてデータベースで数学をやることができ、範囲の比較が容易になるからです。 Entity Frameworkを使用している場合、データベースに適したプロパティからTimeSpanを取得および設定するマップされていないプロパティを宣言することができます。

Entities in Azure Tablesをご覧ください。その一部にはAzure Table Storageからプロパティを除外する方法が記載されています。これにより、EFで提案したものをATSでも実行可能にする必要があります。

+1

私はAzure Table Storage(NoSQLストレージサービス)を使用していますので、それでEFを使用することはできません。私はすでにダニを長期間保存することを考えていました。それは私が現時点で回避策としてやっていることですが、より良い方法があるかどうかを見たいと思っていました。 –

+1

http://convective.wordpress.com/2009/12/30/entities-in-azure-tables/をご覧ください。その一部にはAzure Table Storageからプロパティを除外する方法が記載されています。これにより、EFで提案したものをATSでも実行可能にする必要があります。 – JamieSee

+0

ここでダニを使用します。ティックを適用すると正しいオフセットと時間が得られるように、UTCに保存された時間を標準化してください。 – dunnry

0

私はMicrosoftクライアントの制限に遭遇したので、多くの高レベル抽象化を持つ代替のAzureテーブルストレージクライアント、Lucifure Stashを作成しました。

Lucifure Stashは、データ列> 64K、リスト、配列、列挙、直列化、モーフィング、パブリックおよびプライベートのプロパティとフィールドなどをサポートします。個人使用のために無料であり、http://www.lucifure.comまたはNuGet.com(http://nuget.org/packages/LucifureStash)からダウンロードできます。

Azure Storage Tablesでサポートされているデータ型にTimeSpanをモーフィングすることが簡単にできます。

+0

ありがとう@Lucifure、私はそれが私のニーズに合っているかどうかを見てみよう。 –

0

JamieSeeはTimeSpanをいくつかのlong intにティックとして格納することを提案しているので、オブジェクトをバイト配列にシリアル化することもできます。

どのような複雑な/サポートされていないクラスであっても、それをバイト配列にシリアル化してアップロードし、取り出し、逆シリアル化して元の型に戻すことができます。 KeyValuePairsのリストをアップロードする必要があるときにこれを行いました。

ゲッターとセッターのプロパティで自動変換を作成できます。

0

CloudTableへTimeSpanを格納するために、私はTimeSpanプロパティで翻訳を行いlongプロパティを使用しています:

public class MyEntity : Microsoft.WindowsAzure.Storage.Table.TableEntity 
{ 
    public TimeSpan MyDuration { get; set; } 

    // Workaround the fact that TableEntity does not automatically store a `TimeSpan` 
    public long MyDurationTicks 
    { 
     get { return MyDuration.Ticks; } 
     set { MyDuration = TimeSpan.FromTicks(value); } 
    } 
} 
0

TimeSpanタイプ、さらにはNULL可能TimeSpan?タイプはAzureストレージSDKによってサポートされています> v8.0.0。

TableEntity.Flattenメソッドを静的ヘルパーメソッドを使用してエンティティを平らにし、テーブルのストレージへの書き込み:

https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.tableentity.flatten.aspx

あなたが戻ってテーブルからエンティティを読んだとき、TableEntity.Convertback方法を使用して、元のエンティティに戻ってそれを変換します。

https://msdn.microsoft.com/en-us/library/azure/mt775432.aspx

フラット化とConvertback方法はIEnumerableを/ ICollectionをタイプインデックス付きプロパティを除き、財産のほとんどすべての種類をサポートしています。

私は、TableEntity.FlattenConvertBackのメソッドの下にあるTableEntityAdapterクラスを作成し、開発者が使いやすいようにしました。

あなたがする必要があるのは、オブジェクトをこのアダプタに渡すことだけです。それだけです。 https://www.nuget.org/packages/TableEntityAdapter/

FlattenとConvertBackの方法がどのようにカバーの後ろで機能するかをもっと知りたい場合は、私が書いた記事を見てください。 https://www.nuget.org/packages/ObjectFlattenerRecomposer/

関連する問題