3

Azure Table Storageへの単一のクエリを使用して複数の種類のエンティティを取得するにはどうすればよいですか?のフォローアップとして、Azureテーブルエンティティのシリアル化を制御しようとしていますか?そして(私にとって)予期しない行動に遭遇しました。

<myaccountname>.Petsアイテムを取得するとき、エンティティを保存するときに何に設定しても、名前は常に「 」になります。タイプ名が保持されないのはなぜですか。

MSDNによると:

DataServiceContext.ResolveType

Open Data Protocol(OData)サービスからエンティティを受信するときにクライアントライブラリによって使用されるデフォルトの型解決オプションをオーバーライドするために使用される関数を取得または設定します。

DataServiceContext.ResolveName

エンティティをデータサービスに送信するときにクライアントライブラリによって使用されるデフォルトの型解決戦略をオーバーライドする関数を取得または設定します。

そして、このブログエントリはそうではないはずです。

簡単なテストは次のとおりです。

public class Pet : TableServiceEntity { }
    public class Cat : Pet { }
    public class Dog : Pet { }


    public class Test
    { 

        public void RunTest()
        {
            //this.Create();
            this.Read();
        }

        public TableServiceContext GetTableServiceContext()
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
            tableClient.CreateTableIfNotExist("Pets");

            TableServiceContext serviceContext = tableClient.GetDataServiceContext();

            serviceContext.ResolveName = (entityType) =>
            {
                return entityType.FullName;
            };

            serviceContext.ResolveType = (s) =>
            {
                return Type.GetType(s);
            };

            return serviceContext;
        }

        public void Create()
        {

            var serviceContext = this.GetTableServiceContext();

            // Create entries
            var cat = new Cat() { PartitionKey = "cats", RowKey = "1" };
            serviceContext.AddObject("Pets", cat);

            var dog = new Dog() { PartitionKey = "dogs", RowKey = "1" };
            serviceContext.AddObject("Pets", dog);


            serviceContext.SaveChangesWithRetries();
        }

        public void Read()
        {
            var serviceContext = this.GetTableServiceContext();

            var pets = serviceContext.CreateQuery<Pet>("Pets").AsTableServiceQuery<Pet>().ToArray();

            foreach (var pet in pets)
            {
                Console.WriteLine(pet.GetType());
            }

        }
    }
4

1 に答える 1

1

掘り下げて議論した後、型名が紺碧のテーブル(スキーマレス)では決して見られないことがわかりました。代わりに、すべてのパブリック プロパティがシリアル化され、単にプロパティのペイロードがサービスに送信されます。

タイプを決定する必要がある場合は、ペイロードにプロパティを保存/チェックする必要があります。これは、読み取り/書き込みエンティティ イベントを利用して行うことができます。

異種コレクションを一度に返すか、それを 1 つのタイプに制限することが目標ですか。後者の場合は、可能であれば主キー、行キー、または別のフィールドとそれに基づくクエリにタイプを格納することをお勧めします。

于 2012-05-22T22:01:29.760 に答える