我试图控制 Azure 表实体的序列化,作为如何使用单个查询来检索多种类型的实体到 Azure 表存储?并且遇到了(对我而言)意想不到的行为。
检索项目时,名称始终为“
<myaccountname>.Pets
”,无论我在保存实体时将其设置为什么。为什么不保留类型名?
根据 MSDN:
DataServiceContext.ResolveType
获取或设置一个函数,该函数用于覆盖客户端库在从开放数据协议 (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());
}
}
}