在Azure表存储中向现有实体添加列

时间:2017-03-06 07:42:24

标签: azure-table-storage

我将一些事务数据保存在Azure Table Storage的表中。当我试图"更新"我的表中的现有实体并向其添加新列,看起来它没有添加列。

以下是一个例子:我在表格中保存了时间表条目。当我第一次创建实体时,有一个StartTime但没有EndTime

PersonId -- TransactionId -- StartTime -- EndTime

所以,当我第一次在表格中创建实体时,我最终会得到PersonId, TransactionId and StartTime列。之后,我想添加EndTime但看起来没有添加它,因为我的对象EndTime是一个可以为空的属性,当它是NULL时,列未创建。

是否有办法更新现有实体并在流程中添加列?如果没有,我将不得不在EndTime中放置一些虚拟日期并在初始创建实体期间存储它,以便列在那里,我可以稍后更新。

我宁愿不存储任何虚拟数据。

2 个答案:

答案 0 :(得分:5)

  

是否有办法更新现有实体并在流程中添加列?

是的,根据您的情况,我们可以通过两种方式实现这一目标:编辑交易数据模型或使用# ignore the .ts files *.ts # include the .d.ts files !*.d.ts

1.编辑您的事务数据模型并设置Endtime datetime和null值。演示代码如下,

DynamicTableEntity

如果我们没有将值赋给并尝试向表中插入实体,则没有EndTime列。以下是演示代码。

 public class Transactional:TableEntity
    {
        public string PersonId { get; set; }
        public string TransactionId { get; set; }
        public DateTime StarTime { get; set; }
        public DateTime? EndTime { get; set; }

        public Transactional() { }

        // Define the PK and RK
        public Transactional(string persionId, string transactionId)
        {
            PartitionKey = persionId;
            RowKey = transactionId;
        }
    }  

如何更新实体

 CloudStorageAccount storageAccount = CreateStorageAccountFromConnectionString(CloudConfigurationManager.GetSetting("StorageConnectionString"));
 var tableClient = storageAccount.CreateCloudTableClient();
 var table = tableClient.GetTableReference("tableName");
 table.CreateIfNotExists();
 var guid = Guid.NewGuid().ToString();
 Transactional transactional = new Transactional("tomtest", guid);
 transactional.StarTime =DateTime.UtcNow;
 TableOperation insertOrMergeOperation =   TableOperation.InsertOrMerge(transactional);         
 TableResult result = table.Execute(insertOrMergeOperation);    

2.我们可以使用 // update entity TableOperation retrieveOperation = TableOperation.Retrieve<Transactional>("tomtest", "pk"); //PK, RK TableResult retrieveResult = table.Execute(retrieveOperation); Transactional updateEntity = retrieveResult.Result as Transactional; if (updateEntity != null) updateEntity.EndTime = DateTime.UtcNow; TableOperation insertOrMergeOperation = TableOperation.InsertOrMerge(updateEntity); // Execute the operation. TableResult resultinsertormerge = table.Execute(insertOrMergeOperation); 在流程中添加一列。以下是演示代码。

DynamicTableEntity

答案 1 :(得分:2)

Azure表存储是无架构数据库,这意味着表中的实体实际上可以具有完全不同的列。

换句话说,如果不需要 EndTime 属性,您可以创建实体,并在MergeEntity / UpdateEntity添加该属性如果稍后需要 EndTime ,则进行操作。