Azure:如何在TableStorage中保存IDictionary <string>?</string>

时间:2010-11-28 18:35:20

标签: c# .net azure azure-table-storage dynamic-schema

我有一个带有IDictionary的课程。此对象的大小不固定为任何特定大小。这个想法是拥有我的对象的动态架构。我想将此对象存储在TableStorage中。我怎样才能做到这一点?如何再次使用IDictionary在我的对象内部从商店中检索此信息?

谢谢!

3 个答案:

答案 0 :(得分:1)

DynamicTableEntityIDictionary<string,EntityProperty>作为参数。

此代码在LinqPad

中执行
void Main()
{
var account = "";
var key = "";
var tableName = "";

var storageAccount = GetStorageAccount(account, key);
var cloudTableClient = storageAccount.CreateCloudTableClient();
var table = cloudTableClient.GetTableReference(tableName);

var partitionKey = "pk";
var rowKey = "rk";

//create the entity
var entity = new DynamicTableEntity(partitionKey, rowKey, "*", 
    new Dictionary<string,EntityProperty>{
            {"Prop1", new EntityProperty("stringVal")},
            {"Prop2", new EntityProperty(DateTimeOffset.UtcNow)},
        });

//save the entity
table.Execute(TableOperation.InsertOrReplace(entity));

//retrieve the entity
table.Execute(TableOperation.Retrieve(partitionKey,rowKey)).Result.Dump();
}

static CloudStorageAccount GetStorageAccount(string accountName, string key, bool useHttps = true)
{
var storageCredentials = new StorageCredentials(accountName, key);
var storageAccount = new CloudStorageAccount(storageCredentials, useHttps: useHttps);
return storageAccount;
}

答案 1 :(得分:0)

默认情况下,字典不可序列化。对象必须是可序列化的才能保存到TableStorage。我建议您使用List或Array类型的对象,或者如果List或Arrays不够好,可以为Dictionary编写自己的序列化器。

答案 2 :(得分:0)

您可以使用TableStorageContext中的Read和Write事件来执行此操作。您需要将IDictionary内容存储在其他Field中或作为BLOB文件。在Read事件中,您可以从给定字段创建IDictionary,也可以直接从BLOB文件中检索。在Write事件中,您将IDictionary存储到字段或作为BLOB文件。

重要提示:Write事件发生在Entity traslation步骤之后,如果您选择字段方式,则可能需要将更改直接写入实体的XML序列化。

这听起来很难,但在许多情况下非常有用