我試圖控制序列化的Azure表實體作爲How do I retrieve multiple types of entities using a single query to Azure Table Storage?的後續行動,並遇到(對我來說)意外的行爲。爲什麼Azure表存儲在使用ResolveName時不會保留類型名稱?
當檢索項目的名稱始終是「
<myaccountname>.Pets
」不管我把它設置爲當我保存的實體。爲什麼不保存類型名?
根據MSDN:
DataServiceContext.ResolveType
獲取或設置用於覆蓋從接收實體時使用由客戶端庫的默認類型分辨率選項的功能開放數據協議(OData)服務。
DataServiceContext.ResolveName
獲取或設置一個功能覆蓋由客戶端庫使用的默認類型解析策略,當您發送實體數據服務。
和this blog entry它不應該是這種情況。
下面是一個簡單的測試:
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());
}
}
}
我正在深入探討這個問題,並會盡快添加更多信息,只要我有一些細節。 – AvkashChauhan