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());
}
}
}