0

クラスをAzureTableStorageエンティティにマップする方法について質問があります。BikeRiderとBikeRaceの2つのエンティティがあるとします。私のC#コードには、2つのクラスがあり、それぞれに、もう一方のコレクションであるプロパティがあります。したがって、BikeRiderクラスにはListプロパティがあり、その逆も同様です。それがここで理想的でない場合は、遠慮なく意見を述べてください、しかしそれは私が今日持っているものです。

それはどのようにAzureテーブルにマップされますか?ここで、多対多の関係を格納する方法について説明するSOに関する質問を見つけましたが、私の質問は、Listプロパティを含むオブジェクトを保存するときに、そのプロパティをどのように処理するかということです。

ありがとう!

更新これへの返信を待っている間(そして私は何も得られないかもしれないと思っていた)、私はこの解決策を思いついた:

上で説明したように、C#BikeRiderタイプとBikeRaceタイプはどちらも、もう一方のタイプのListプロパティを持っています。それぞれに、他のインスタンスをリストに追加するためのインスタンスメソッドがあります(つまり、BikeRaceには、BikeRiderのインスタンスをBikeRace.BikeRidersリストに追加する「AddBikeRider」というメソッドがあります。その逆も同様です)。

ただし、Azure Table Storageに保存すると、次の情報を含む3つのテーブルがあります。

BikeRiderテーブル

  • PartitionKey、RowKey、

BikeRider情報RiderRaceテーブル

  • PartitionKey:BikeRider RowKey
  • RowKey:BikeRace RowKey
  • 他の情報

BikeRaceテーブル

  • PartitionKey、RowKey
  • レース内のすべてのBikeRiderのIDの個別の値(BikeRider RowKey-ただし、多くの場合があります)。

このように、BikeRiderからクエリを実行し、彼が参加しているBikeRacesを取得しようとすると、パーティションキーがあり、そのパーティションのすべての行がBikeRacesになります。BikeRaceからクエリを実行していて、レースですべてのBikeRiderを取得しようとしている場合は、BikeRiderテーブルのクエリに使用するBikeRiderIDがあります。これらのキーを複数の場所に保存する以外にデータを複製することはないため、データが変更された場合に複数の保存場所に保存する必要はありません。

ここでの課題は、Mingが投稿したものです-Table ServiceのsaveメソッドがListプロパティを持つ型の例外をスローした場合、リスト型を処理してそれをsaveに変換する独自の予備のsaveメソッドを使用してより単純なインターフェイスを作成できますか?最初にデータ型を指定して、説明した方法でAzureテーブルに永続化できますか?これは複雑すぎますか、それとも脆すぎますか?

4

1 に答える 1

1

これはサポートされていません。テーブルストレージはリストプロパティをサポートしていません。CLRデータモデルでlistプロパティを使用すると、WCF Data Servicesはそれをシリアル化しようとし、例外が発生します。

関係をシミュレートするために、BikeRiderIDなどのBikeRaceエンティティにプロパティを作成できます。

読み取り専用のコレクションが必要な場合は、GetBikeRacesなどのBikeRiderクラスに(プロパティではなく)メソッドを作成できます。実装内で、BikeRaceテーブルにクエリを実行して、BikeRiderIDが現在の自転車ライダーのIDであるすべてのエンティティを検索します。自転車レースのリストを更新する場合は、別のリクエストを使用してBikeRiderテーブルも更新する必要があります。

サンプルについては、 http://blog.smarx.com/posts/one-to-many-relationships-in-windows-azure-tablesを参照してください。

于 2012-06-04T02:51:22.133 に答える