我正在用头撞墙。我有一个函数,基本上是一个名为 的 Upsert TryCreateOrUpdate。我确实意识到现在存在 upsert 函数,但这是一些较旧的代码。这是函数:public static async Task<string> TryCreateOrUpdate<T>(T data) where T : ViewModelBase{ var options = string.IsNullOrWhiteSpace(data.PartitionKey) ? null : new RequestOptions { PartitionKey = new PartitionKey(data.PartitionKey) }; try { var response = await Client.CreateDocumentAsync(Collection.SelfLink, data, options, true); } catch (DocumentClientException dce) { switch (dce.StatusCode.Value) { ... case HttpStatusCode.Conflict: try { var link = UriFactory.CreateDocumentUri(_databaseId, _collectionId, data.Id); await Client.ReplaceDocumentAsync(link, item, options); } catch (Exception e) { return $"There was an error updating the document."; } break; default: ... } } catch (Exception e) { return "There was an unknown error creating the document."; } return "OK";}我正在尝试插入一个 id 为 6 位数字的文档作为字符串。我检查了我的 Cosmos DB,可以确认数据库中没有具有我尝试更新插入的 id 的文档。所以它应该会导致创建。创建文档的行抛出一个DocumentClientException:系统中已存在具有指定 ID 的实体。但是,替换代码行会引发此异常:系统中不存在具有指定 ID 的实体。嗯什么?究竟存在还是不存在?!正如我所说,我在运行之前进行了检查,发现该文档不存在。我什至尝试更改所有这些代码以使用较新的代码UpsertDocumentAsync,但仍然收到错误系统中已存在具有id的实体尽管正如我所说,该文件并不存在。
2 回答
慕斯王
TA贡献1864条经验 获得超2个赞
虽然我不太了解 CosmosDb 和相关包的内部工作原理,因为它与此问题相关,但原因似乎是重写了基类中 Id 字段的编写方式。
以前是这样写的:
public string id => Id;
public string Id { get; set; }
然后又改成了:
[JsonProperty("id")]
public string Id { get; set; }
请注意,id => Id 已被删除。现在它引起了问题。我们将其更改为:
public string id {
get { return Id; }
set { Id = value; }
}
public string Id { get; set; }
现在一切都像以前一样。
POPMUISE
TA贡献1765条经验 获得超5个赞
我在尝试创建文档时遇到了完全相同的错误。尽管文档的 ID 是唯一的,但我忘记了我在容器上配置了唯一的密钥。由于使用 Azure 门户(几乎?)不可能找到在 Cosmos Db 中的容器上定义的唯一键,因此这一点很容易被忽视。
- 2 回答
- 0 关注
- 97 浏览
添加回答
举报
0/150
提交
取消