8

以前のバージョンでは、エンティティが存在するかどうかを知らなくてもエンティティを削除するためにこれを行うことができました。

svc = new TestContext();
item = new TestEntity("item2pk", "item2rk");
svc.AttachTo("TestTable", item, "*");
svc.DeleteObject(item);
svc.SaveChanges();

(ソース)

新しい TableOperations には、この構文はありません。この古い方法を使用する必要がありますか、それとも方法はありますか? すべてのコードでバージョン 2 の新しいクラスを使用しているため、一貫性を保ちたいと考えています。

編集:タイトルは誤解を招くものでした

4

2 に答える 2

13

使用する必要がありますTableOperation.Delete

var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
var table = storageAccount.CreateCloudTableClient()
                            .GetTableReference("tempTable");
table.CreateIfNotExists();

// Add item.
table.Execute(TableOperation.Insert(new TableEntity("MyItems", "123")));

// Load items.
var items = table.ExecuteQuery(new TableQuery<TableEntity>());
foreach (var item in items)
{
    Console.WriteLine(item.PartitionKey + " - " + item.RowKey);
}

// Delete item (the ETAG is required here!).
table.Execute(TableOperation.Delete(new TableEntity("MyItems", "123") { ETag = "*" }));

削除は、存在するエンティティに対してのみ機能します。古いクライアントにはオプションがありましたが、操作ContinueOnErrorと互換性がありませんでした(ここで説明されているように)。Batch

エンティティが存在することがわからない場合に削除のバッチを成功させる唯一の方法は、最初にエンティティを追加する (または既に存在する場合は置き換える) ことです。

var ensureItemsBatch = new TableBatchOperation();
ensureItemsBatch.InsertOrReplace(new MyEntity("MyItems", "123") { Active = false });
ensureItemsBatch.InsertOrReplace(new MyEntity("MyItems", "456") { Active = false });
ensureItemsBatch.InsertOrReplace(new MyEntity("MyItems", "789") { Active = false });
table.ExecuteBatch(ensureItemsBatch);

var deleteItemsBatch = new TableBatchOperation();
deleteItemsBatch.Delete(new MyEntity("MyItems", "123") { ETag = "*" });
deleteItemsBatch.Delete(new MyEntity("MyItems", "456") { ETag = "*" });
deleteItemsBatch.Delete(new MyEntity("MyItems", "789") { ETag = "*" });
table.ExecuteBatch(deleteItemsBatch);
于 2012-11-06T20:03:37.060 に答える