2

Steve Marxは、新しいストレージプロトコルバージョンの一部としてAzureTableStorageでアップサートを実行するための新しい拡張メソッドについて次のように書いています。

http://blog.smarx.com/posts/extension-methods-for-the-august-storage-features

ただし、アップサートではなく、無条件のマージまたはスローの元の操作を実行したい場合はどうなりますか。オブジェクトをマージして単一のフィールドを更新したいのですが、マージしているプロパティのみを含む新しいエンティティを作成するのではなく、エンティティが存在しない場合はスローします。

これは可能ですか?他の場所でupsertを使用したいので、IoCに。GetDataServiceContext2011の代わりにから作成されたコンテキストを提供してもらうことにしましたGetDataServiceContext。この2つを交互に使用できると思いますが、Azureチームが公式ライブラリを更新する場合は役に立ちません。

MSDNによると:

エンティティの挿入またはマージ操作はMERGE動詞を使用し、2011-08-18バージョン以降を使用して呼び出す必要があります。また、If-Matchヘッダーは使用しません。これらの属性は、この操作をエンティティの更新操作と区別しますが、要求の本文は両方の操作で同じです。

では、ストレージライブラリに、保存時にワイルドカードIf-Matchをまったく発行しないのではなく、発行させるにはどうすればよいIf-Matchですか?

4

1 に答える 1

5

AttachToetagにはアスタリスクを付けて使用してください。その結果、If-Match: *。完全な実例を次に示します。

class Entity : TableServiceEntity
{
    public string Text { get; set; }
    public Entity() { }
    public Entity(string rowkey) : base(string.Empty, rowkey) { }
}
class Program
{
    static void Update(CloudStorageAccount account)
    {
        var ctx = account.CreateCloudTableClient().GetDataServiceContext();

        var entity = new Entity("foo") { Text = "bar" };
        ctx.AttachTo("testtable", entity, "*");
        ctx.UpdateObject(entity);
        ctx.SaveChangesWithRetries();
    }

    static void Main(string[] args)
    {
        var account = CloudStorageAccount.Parse(args[0]);
        var tables = account.CreateCloudTableClient();
        tables.CreateTableIfNotExist("testtable");
        var ctx = tables.GetDataServiceContext();

        try { Update(account); } catch (Exception e) { Console.WriteLine("Exception (as expected): " + e.Message); }

        ctx.AddObject("testtable", new Entity("foo") { Text = "foo" });
        ctx.SaveChangesWithRetries();

        try { Update(account); } catch (Exception e) { Console.WriteLine("Unexpected exception: " + e.Message); }

        Console.WriteLine("Now text is: " + tables.GetDataServiceContext().CreateQuery<Entity>("testtable").Where(e => e.PartitionKey == string.Empty && e.RowKey == "foo").Single().Text);
        tables.DeleteTableIfExist("testtable");
    }
}
于 2011-10-19T16:35:42.120 に答える