2017-03-06 8 views
0

Azureテーブルストレージのテーブルにトランザクションデータを保存しています。テーブルの既存のエンティティを「更新」して新しい列を追加しようとすると、その列が追加されていないように見えます。Azureテーブルストレージ内の既存のエンティティにカラムを追加する

例:タイムシートのエントリをテーブルに保存しています。私は最初のエンティティを作成するとき、のStartTimeが、私は最初のテーブルにエンティティを作成するとき

だから、私はPersonId, TransactionId and StartTime列で終わるなし終了時間があります。後でEndTimeを追加したいのですが、私のオブジェクトではEndTimeがnullableプロパティで、NULLのときはその列が作成されていないため、追加しないように見えます。

既存のエンティティを更新してプロセスに列を追加する方法はありませんか?そうでない場合は、EndTimeにダミーの日付を入れて、エンティティの最初の作成時に格納して、その列が存在するようにして、後で更新する必要があります。

しかし、私はむしろダミーデータを保存しません。

答えて

4

既存のエンティティを更新してプロセスに追加する方法はありませんか?

はい、あなたのケースに応じて、我々は2つの方法でそれを行うことができます:トランザクションデータモデルや使用を編集DynamicTableEntity

1.Editあなたのトランザクションデータモデルとセット終わりの時の日時とNULL値が受け入れられています。次のようにデモコード、

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.Weは、プロセス内の列を追加する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

Azureテーブルストレージは、テーブル内のエンティティが実際に完全に異なる列を有することを意味スキーマレスデータベースです。言い換えれば

それが必要ない場合は、あなたが終了時間プロパティずにエンティティを作成することができ、かつ終了時間が後で必要になった場合MergeEntity/UpdateEntity操作によって、将来的にプロパティを追加しました。

関連する問題