无法保存参考类型

时间:2014-03-04 21:06:36

标签: c# azure azure-storage

我是初学者,想要了解有关Azure表存储的更多信息,但我很沮丧这个简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;

namespace AzureTablesTest
{
    public class PersonName
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    public class Person : TableEntity
    {
        public PersonName Name { get; set; }
        public int Age { get; set; }

        public Person()
        {
        }

        public Person(string lastname, string firstname)
        {
            RowKey = firstname;
            PartitionKey = lastname;
            Name = new PersonName { FirstName = firstname, LastName = lastname };
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // Retrieve the storage account from the connection string.
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");

            // Create the table client.
            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

            // Create the table if it doesn't exist.
            CloudTable table = tableClient.GetTableReference("people");
            table.CreateIfNotExists();

            Person p = new Person("Foo", "Bar");

            TableOperation insertOperation = TableOperation.Insert(p);

            // Execute the insert operation.
            table.Execute(insertOperation);

            TableOperation retrieveOperation = TableOperation.Retrieve<Person>("Foo", "Bar");

            // Execute the retrieve operation.
            TableResult retrievedResult = table.Execute(retrieveOperation);

            string firstname = ((Person)retrievedResult.Result).Name.FirstName;
        }
    }
}

看起来Azure无法存储引用类型。当我保存,然后检索Person时,对于检索到的人,Name为null,因此当我尝试从该人的Name属性中获取FirstName时,我得到一个空指针异常:

string firstname = ((Person)retrievedResult.Result).Name.FirstName;

我没有在任何地方读到这是不可能的。我用它作为学习的一个条目:http://www.windowsazure.com/en-us/documentation/articles/storage-dotnet-how-to-use-table-storage-20/。通过阅读“介绍”

  1. 存储能够为Web规模应用程序提供服务的结构化数据的TB
  2. 存储不需要复杂连接,外键或存储过程的数据集,并且可以非规范化以便快速访问
  3. 使用聚簇索引快速查询数据
  4. 使用OData协议和使用WCF数据服务.NET库的LINQ查询访问数据
  5. 在我眼里,我的榜样应该是可能的。但我想这是不可能的?

2 个答案:

答案 0 :(得分:0)

表存储不支持复杂类型。

请参阅此处获取允许的数据类型列表:http://msdn.microsoft.com/en-us/library/windowsazure/jj553018.aspx

答案 1 :(得分:0)

您可以在TableEntity中使用某些属性类型,并将它们自动保存到表中。支持的类型列表位于此网页的末尾:http://msdn.microsoft.com/en-us/library/windowsazure/dd179338.aspx。您的PersonName类型是自定义类型,因此不受支持。

您可以覆盖TableEntity的ReadEntity和WriteEntity方法(http://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.table.itableentity_methods.aspx)来自定义每个属性的序列化/反序列化方式。然后你可以做一些事情,比如将PersonName中的每个子属性保存到它自己的表属性。