Я пытаюсь контролировать сериализацию сущностей таблицы 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());
}
}
}