我是初学者,想要了解有关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/。通过阅读“介绍”
答案 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中的每个子属性保存到它自己的表属性。