3

我试图控制 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());
            }

        }
    }
4

1 回答 1

1

经过一些挖掘和讨论后,我发现天蓝色表(无模式)从未见过类型名。相反,所有公共属性都被序列化,并简单地将属性的有效负载发送到服务。

如果您需要确定需要在有效负载中存储/检查属性的类型。这可以利用读/写实体事件来完成。

Is your goal to return a heterogeneous collection at once, or limit it down to just one type. If it the latter then it would be good to store the type in the Primary Key ,Row key if possible, or in a separate field and query based on that.

于 2012-05-22T22:01:29.760 回答