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

我正在用头撞墙。


我有一个函数,基本上是一个名为 的 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的实体


尽管正如我所说,该文件并不存在。


潇潇雨雨
浏览 98回答 2
2回答

慕斯王

虽然我不太了解 CosmosDb 和相关包的内部工作原理,因为它与此问题相关,但原因似乎是重写了基类中 Id 字段的编写方式。以前是这样写的:public string id => Id;public string Id { get; set; }然后又改成了:[JsonProperty("id")]public string Id { get; set; }请注意,id => Id 已被删除。现在它引起了问题。我们将其更改为:public string id {&nbsp; &nbsp; get { return Id; }&nbsp; &nbsp; set { Id = value; }}public string Id { get; set; }现在一切都像以前一样。

POPMUISE

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