调用Azure CosmosDb PatchItemAsync报指定输入无效问题咨询
首先排除功能权限问题
Azure Cosmos DB 的部分文档更新(Patch)功能已于2021年正式全局可用,不需要额外为账号启用私有预览权限,报错和功能开关无关。
常见报错原因及修复方案
使用Replace操作但目标属性不存在
PatchOperation.Replace要求操作的属性必须已存在于目标文档中,若endpointId字段尚未创建就调用Replace会触发参数错误。
修复方式:替换为Set操作,属性存在时会覆盖值,不存在时自动新增:patchOperations.Add(PatchOperation.Set("/endpointId", 100));id与分区键不匹配目标文档
确认传入的id="id1"和PartitionKey("partitionkey1")确实对应存在的文档,且分区键的值的类型、大小写和文档中存储的完全一致:比如文档内分区键是数字类型,传入字符串类型的分区键也会触发参数错误。
可以先调用ReadItemAsync传入相同的id和分区键,验证是否能正常读取到目标文档。SDK版本过低
低于3.23.0版本的Microsoft.Azure.CosmosNuGet包存在Patch相关的已知兼容性问题,建议升级到最新稳定版。属性路径错误
如果endpointId是嵌套在其他对象下的属性,比如存储在config对象内,正确的路径应为/config/endpointId,直接写/endpointId会找不到对应路径触发错误。Schema校验不通过
若账号配置了文档Schema校验规则,需要确认endpointId的类型约束允许赋值为数字类型,类型不匹配也会触发参数错误。
进阶排查方式
如果上述方案无法解决问题,可以在调用时开启写入响应内容,捕获详细错误:
await _container.PatchItemAsync<Watermark>(id, partitionKey, patchOperations, new PatchItemRequestOptions { EnableContentResponseOnWrite = true });
捕获抛出的CosmosException异常,查看ResponseBody属性即可获得更精准的错误定位信息。
内容的提问来源于stack exchange,提问作者chiaDev

