4

Azureテーブルで、エンティティのRowKeyとPartitionKeyを知っている場合(そのエンティティを取得できるようにするため)、そのエンティティの特定のプロパティ値を編集するにはどうすればよいですか?

これはかなり標準的な操作のように聞こえますが、通常の方法は次のようになります。

public void UpdateEntity(ITableEntity entity)
{
    TableOperation replaceOperation = TableOperation.Replace(entity);
    table.Execute(replaceOperation);
}

つまり、個々のプロパティ名と値のペアではなく、C#TableEntityオブジェクト全体が置換として提供されます。

私はもっ​​と次のようなものが欲しいです:

public void UpdateEntityProperty<T>(string partitionKey, string rowKey,
                                string propertyName, T newPropertyValue)
{
    TableOperation retrieveOperation = TableOperation.Retrieve(partitionKey, rowKey);
    TableResult retrievedResult = table.Execute(retrieveOperation);
    TableEntity entity = (TableEntity)retrievedResult.Result;

    // This  line, of course, doesn't compile. But you get the idea.
    entity.SetPropertyValue(propertyName, newPropertyValue);

    TableOperation replaceOperation = TableOperation.Replace(entity);
    table.Execute(replaceOperation);
}

私の理解では、行はその行のプロパティに対応するキーと値のペアのセットとして格納されるため、TableEntityから派生したC#クラス全体を定義しなくても、プロパティの値を簡単に更新できます。

どうすればいいですか?

4

3 に答える 3

10

完全を期すために、Gaurav Mantriの回答に触発されて、私が最終的に使用したものは次のとおりです。

public void UpdateEntityProperty(string partitionKey, string rowKey,
                                 string propertyName, string newPropertyValue)
{
    var entity = new DynamicTableEntity(partitionKey, rowKey);
    var properties = new Dictionary<string, EntityProperty>();
    properties.Add(propertyName, new EntityProperty(newPropertyValue));
    var mergeOperation = TableOperation.Merge(entity);
    table.Execute(mergeOperation);
}
于 2013-02-08T11:54:24.547 に答える
9

「置換」操作の代わりに、「マージ」操作を実行します(http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.table.tableoperation.merge)。マージ操作により、変更されるプロパティのみが変更され、他のすべてのプロパティは変更されません。

public void UpdateEntityProperty<T>(string partitionKey, string rowKey,
                                    string propertyName, T newPropertyValue)
{
    TableOperation retrieveOperation = TableOperation.Retrieve(partitionKey, rowKey);
    TableResult retrievedResult = table.Execute(retrieveOperation);
    TableEntity entity = (TableEntity)retrievedResult.Result;

    // This  line, of course, doesn't compile. But you get the idea.
    entity.SetPropertyValue(propertyName, newPropertyValue);

    TableOperation mergeOperation = TableOperation.Merge(entity);
    table.Execute(mergeOperation);
}

以下のより完全な例。ここでは、最初に従業員を作成し、次にその従業員の「MaritalStatus」プロパティのみを変更しました。

CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

CloudTable table = storageAccount.CreateCloudTableClient().GetTableReference("Employee");
DynamicTableEntity entity = new DynamicTableEntity()
{
    PartitionKey = "Employee",
    RowKey = "01",
};
Dictionary<string, EntityProperty> properties = new Dictionary<string, EntityProperty>();
properties.Add("Name", new EntityProperty("John Smith"));
properties.Add("DOB", new EntityProperty(new DateTime(1971, 1, 1)));
properties.Add("MaritalStatus", new EntityProperty("Single"));
entity.Properties = properties;

TableOperation insertOperation = TableOperation.Insert(entity);
table.Execute(insertOperation);

DynamicTableEntity updatedEntity = new DynamicTableEntity()
{
    PartitionKey = "Employee",
    RowKey = "01",
    ETag = "*",
};
Dictionary<string, EntityProperty> newProperties = new Dictionary<string, EntityProperty>();
newProperties.Add("MaritalStatus", new EntityProperty("Married"));
updatedEntity.Properties = newProperties;
TableOperation mergeOperation = TableOperation.Merge(updatedEntity);
table.Execute(mergeOperation);

InsertOrMerge(http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storage.table.tableoperation.insertormerge.aspx)操作を試すこともできます。

于 2013-02-06T15:34:44.970 に答える
0

これを試して:

if (entity != null)
{
     entity.propertyName = newPropertyValue;
     TableOperation updateOperation = TableOperation.Replace(entity);
     table.Execute(updateOperation);
}
于 2013-02-06T15:27:12.197 に答える