为了账号安全,请及时绑定邮箱和手机立即绑定

具有 id 的实体已存在且在 CosmosDB 中不同时存在

具有 id 的实体已存在且在 CosmosDB 中不同时存在

C#
潇潇雨雨 2023-08-13 16:28:36
我正在用头撞墙。我有一个函数,基本上是一个名为 的 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; }

现在一切都像以前一样。


查看完整回答
反对 回复 2023-08-13
?
POPMUISE

TA贡献1765条经验 获得超5个赞

我在尝试创建文档时遇到了完全相同的错误。尽管文档的 ID 是唯一的,但我忘记了我在容器上配置了唯一的密钥。由于使用 Azure 门户(几乎?)不可能找到在 Cosmos Db 中的容器上定义的唯一键,因此这一点很容易被忽视。



查看完整回答
反对 回复 2023-08-13
  • 2 回答
  • 0 关注
  • 62 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信