Опитвам се да контролирам сериализирането на обекти на таблица на Azure като продължение на Как да извлека множество типове обекти с помощта на една заявка към Azure Table Storage? и сте срещнали (за мен) неочаквано поведение.
При извличане на елементи името винаги е „
<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());
}
}
}