2017-03-06 56 views
0

我正在Azure表存儲的表中保存一些事務數據。當我嘗試「更新」表中的現有實體並向其添加新列時,看起來好像沒有添加列。將列添加到Azure表存儲中的現有實體

下面是一個示例:我在表中保存時間表條目。當我第一次創建實體,有一個開始時間,但沒有結束時間

所以,當我第一次在表中創建實體,我結束了PersonId, TransactionId and StartTime列。後來,我想添加EndTime,但看起來不添加它,因爲在我的對象中,EndTime是可以爲空的屬性,當它是NULL時,不會創建該列。

是否沒有辦法更新現有實體並在該過程中添加列?如果不是,我將不得不在EndTime中放置一些虛擬日期,並在初始創建實體的過程中存儲它,以便該列在那裏,以後我可以更新它。

我寧可不存儲任何虛擬數據。

回答

4

是否沒有辦法更新現有實體並在過程中添加列?

是,根據你的情況,我們可以做到這一點與2種方式:編輯事務數據模型或者使用DynamicTableEntity

1.Edit的事務性的數據模型,並設置結束時間datetime和空值被接受。演示代碼如下,

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);  

如何更新實體

// 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); 

2.我們可以使用DynamicTableEntity在過程中添加一列。以下是演示代碼。

var entity = new DynamicTableEntity("tomtest", "pk"); //PK, RK 
    entity.Properties.Add("EndTime", new EntityProperty(DateTime.UtcNow));  //properties want to add  
    var mergeOperation = TableOperation.InsertOrMerge(entity); 
    table.Execute(mergeOperation); 
2

天青表存儲是一個方案較少數據的基礎上,這意味着在表中的實體可以具有完全不同的列是否確實。

換句話說,你可以創建實體,而不結束時間財產,如果不需要的話,並通過MergeEntity/UpdateEntity操作添加在今後的財產,如果結束時間以後需要。

相關問題