使用私有setter将POCO存储在Azure表中

时间:2017-12-08 23:23:07

标签: c# azure-table-storage

在Azure存储表中存储C#对象时,将忽略具有私有setter的属性。是否可以在不将setter公开的情况下将这些属性写入表中?

Json.net通过JsonProperty属性提供此功能。存储表是否有可用的此类属性?我能找到的唯一属性是IgnorePropertyAttribute,它用于忽略属性。

class TestEntity : TableEntity
{
    public TestEntity(string property1, string property2)
    {
        this.Property1 = property1;
        this.Property2 = property2;
    }
    public string Property1 { get; set; }
    public string Property2 { get; private set; }
}

TestEntity testEntity = new TestEntity("Value1", "Value2");
testEntity.PartitionKey = "PartitionKey";
testEntity.RowKey = "RowKey";
TableOperation insertOperation = TableOperation.Insert(testEntity);
table.Execute(insertOperation);

在上面的示例中,只有Property1(Value1)存储在表中。不存储Property2的值。存储它的唯一方法是将setter更改为public。

1 个答案:

答案 0 :(得分:1)

您不需要覆盖ITableEntity接口,因为8.0版Table Storage SDK支持将自定义.Net对象写入和读取到表存储(包括具有私有设置器的属性)。 SDK支持多种方式。

您的自定义对象甚至不需要实现ITableEntity接口,也不需要继承TableEntity类。它们还可以包含复杂的嵌套属性。除IEnumerable类型索引属性(列表,数组等)外,所有这些都受支持。

所以这是如何:

  1. 您可以使用辅助方法TableEntity.Flatten静态方法将自定义.Net实体转换为平面的EntityProperties字典。使用该Dictionary创建DynamicTableEntity并写入表存储。您可以使用相同的PK,RK读取该实体,并使用TableEntity.ConvertBack<YourEntityType>方法重新构建原始实体。

  2. 第二种替代方法是,您可以在SDK中使用TableEntityAdapter类。 您可以在此处查看我在类似问题中给出的示例用法答案: Sample writing a generic object to Azure Storage?