Cosmodb,为什么这个更新不起作用?

时间:2018-01-29 07:52:33

标签: azure-cosmosdb

我正在尝试查询订单并更新它们。我已经能够在单元测试中找出我的问题:

    [Fact(DisplayName = "OrderDocumentRepositoryFixture.Can_UpdateAsync")]
public async void Can_UpdateByQueryableAsync()
{
    var order1 = JsonConvert.DeserializeObject<Order>(Order_V20170405_133926_9934934.JSON);
    var orderId1 = "Test_1";
    order1.Id = orderId1;
    await sut.CreateAsync(order1);


    foreach (var order in sut.CreateQuery())
    {
    order.Version = "myversion";
        await sut.UpdateAsync(order);
        var ordersFromDb = sut.GetByIdAsync(orderId1).Result;
        Assert.Equal("myversion", ordersFromDb.Version);
    }
}

其中:

public IQueryable<T> CreateQuery()
{
    return _client.CreateDocumentQuery<T>(UriFactory.CreateDocumentCollectionUri(_databaseId, CollectionId));
}

使用此代码,订单不会更新。

如果我按照以下内容替换 CreateQuery(),它确实有效:

[Fact(DisplayName = "OrderDocumentRepositoryFixture.Can_UpdateAsync")]
public async void Can_UpdateByQueryableAsync()
{
    var order1 = JsonConvert.DeserializeObject<Order>(Order_V20170405_133926_9934934.JSON);
    var orderId1 = "Test_1";
    order1.Id = orderId1;
    await sut.CreateAsync(order1);


        var order = sut.GetByIdAsync(orderId1).Result;

    order.Version = "myversion";
        await sut.UpdateAsync(order);
        var ordersFromDb = sut.GetByIdAsync(orderId1).Result;
        Assert.Equal("myversion", ordersFromDb.Version);

}

,其中

public async Task<T> GetByIdAsync(string id)
{
    try
    {
        var documentUri = UriFactory.CreateDocumentUri(_databaseId, CollectionId, id);
        var document = (T) await ((DocumentClient) _client).ReadDocumentAsync<T>(documentUri);

        return document;
    }
    catch (DocumentClientException e)
    {
        if (e.StatusCode == HttpStatusCode.NotFound) return null;
        throw;
    }
}

我一直试图理解为什么这不起作用。显然我可以在更新之前总是做一个GetByIdAsync,但这看起来有点过分了吗?

我不能看到什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

您创建了查询,但从未执行过它(CreateDocumentQuery只是设置查询)。尝试将您的通话改为:

foreach (var order in sut.CreateQuery().ToList())
{
   //
}

另请注意:如果您一直在查询单个文档,并且您知道该ID,那么ReadDocumentAsync()(您的备用代码路径)将更加有效,RU明智。