我正在尝试对 CosmosDb 中的子文档进行部分更新。我的对象模型是这样的:
public class PhoneBookCategory
{
public string Id { get; set; }
public string Name { get; set; }
public TestObject SubProp { get; set; }
}
public class TestObject
{
public string StringProp { get; set; }
public int? IntProp { get; set; }
}
假设我想更新 Name 属性和 SubProp,我会这样做
List<PatchOperation> updates = [];
updates.Add(PatchOperation.Add($"/Name", "new name"));
updates.Add(PatchOperation.Add($"/SubProp", new TestObject { StringProp = "hello"}));
database.GetContainer("collectionName").PatchItemAsync<PhoneBookCategory>(item.Id, new PartitionKey(item.Id), patchOperations)
这个效果很好。现在假设我只想修改
SubProp.StringProp
。所以,我的第二个 PatchOperation 将变成
updates.Add(PatchOperation.Add($"/SubProp/StringProp", "hello"));
但这只是错误请求,并且没有有用的错误消息(原因是 ())。
我想‘也许,它需要替换 subprop,因为在这种情况下我们知道 SubProp 存在,并且我们只想更改 SubProp 文档上的值,所以我尝试了这个:
updates.Add(PatchOperation.Replace($"/SubProp/StringProp", "hello"));
仍然没有骰子。
那么我做错了什么?根据概述,允许子文档更新。
请注意,我正在使用
CosmosClientOptions.SerializerOptions.PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
(以防有人想知道为什么我使用 CamelCase 编写补丁操作。
下面是我测试过的工作示例,如果仍有错误,可以显示详细错误。
using Microsoft.Azure.Cosmos;
using Newtonsoft.Json;
internal class Program
{
private static async Task Main(string[] args)
{
var endpoint = "xxx";
var key = "xxx";
var itemId = "a835a3c9-fa0a-42f8-b7c6-8d0e93a2e96b";
try
{
var cosmosClient = new CosmosClient(endpoint,key);
var database = cosmosClient.GetDatabase("MyDatabase");
var container = database.GetContainer("MyContainer");
var patchOperations = new[]
{
PatchOperation.Replace("/SubProp/StringProp", "hello")
};
ItemResponse<PhoneBookCategory> itemResponse = await container.PatchItemAsync<PhoneBookCategory>(itemId, new PartitionKey(itemId), patchOperations);
Console.WriteLine($"Item modified with id {itemResponse.Resource.Id}");
}
catch (CosmosException ex)
{
Console.WriteLine($"Cosmos DB Exception with Status {ex.StatusCode} Message: {ex.Message}");
}
}
}
public class PhoneBookCategory
{
[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
public string Name { get; set; }
public TestObject SubProp { get; set; }
}
public class TestObject
{
public string StringProp { get; set; }
public int? IntProp { get; set; }
}