我将一些事务数据保存在Azure Table Storage的表中。当我试图"更新"我的表中的现有实体并向其添加新列,看起来它没有添加列。
以下是一个例子:我在表格中保存了时间表条目。当我第一次创建实体时,有一个StartTime但没有EndTime
PersonId -- TransactionId -- StartTime -- EndTime
所以,当我第一次在表格中创建实体时,我最终会得到PersonId, TransactionId and StartTime
列。之后,我想添加EndTime
但看起来没有添加它,因为我的对象EndTime
是一个可以为空的属性,当它是NULL
时,列未创建。
是否有办法更新现有实体并在流程中添加列?如果没有,我将不得不在EndTime
中放置一些虚拟日期并在初始创建实体期间存储它,以便列在那里,我可以稍后更新。
我宁愿不存储任何虚拟数据。
答案 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 ,则进行操作。