Защо Azure Table Storage не запазва името на типа при използване на ResolveName?

Опитвам се да контролирам сериализирането на обекти на таблица на 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());
            }

        }
    }

person Jonas Stensved    schedule 22.05.2012    source източник
comment
Задълбочавам се в този проблем и ще добавя повече информация веднага щом имам подробности..   -  person AvkashChauhan    schedule 22.05.2012


Отговори (1)


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

Ако трябва да определите типа, ще трябва да съхраните/проверите свойство в полезния товар. Това може да се направи, като се използват събитията на обекта за четене / писане.

Целта ви е да върнете разнородна колекция наведнъж или да я ограничите само до един тип. Ако е последното, би било добре да съхраните типа в Първичен ключ, ключ за ред, ако е възможно, или в отделно поле и заявка въз основа на това.

person AvkashChauhan    schedule 22.05.2012