Почему хранилище таблиц Azure не сохраняет имя типа при использовании ResolveName?

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

        }
    }

person Jonas Stensved    schedule 22.05.2012    source источник
comment
Я копаюсь в этом вопросе и добавлю больше информации, как только у меня появятся подробности.   -  person AvkashChauhan    schedule 22.05.2012


Ответы (1)


После некоторого поиска и обсуждения я обнаружил, что typename никогда не отображается в лазурных таблицах (которые не содержат схемы). Вместо этого все общедоступные свойства сериализуются и просто отправляются полезной нагрузке свойств в службу.

Если вам нужно определить тип, вам нужно будет сохранить/проверить свойство в полезной нагрузке. Это можно сделать, используя события сущности чтения/записи.

Ваша цель — вернуть разнородную коллекцию сразу или ограничить ее одним типом. Если последнее, то было бы хорошо сохранить тип в Primary Key, Row key, если это возможно, или в отдельном поле и запросить на его основе.

person AvkashChauhan    schedule 22.05.2012