gpt4 book ai didi

azure - 关于 Azure Cosmos DB 中的 CreateItemAsync 和新 PartitionKey 的混淆 - .NET Core

转载 作者:行者123 更新时间:2023-12-02 22:54:15 31 4
gpt4 key购买 nike

我正在尝试使用 Azure Cosmos DB 设置一个简单的控制台项目。我对分区键的用法感到困惑。

注意,我已经看过这个解决方案,但我相信我的情况略有不同。

我正在像这样设置容器。

private string PartitionKeyPath = "/ProductPartitionKey";
this.container = await this.database.CreateContainerIfNotExistsAsync(containerId, PartitionKeyPath);

下面是一个 JSON 示例,它存储在容器中。所以,我成功添加了项目。

{
"Name": "Super Curtain",
"UnitPrice": 500,
"id": "124BBC08-F51C-4ED4-B961-8DD0C966F66F",
"ProductPartitionKey": "Hello",
"_rid": "m2VTANekt8ACAAAAAAAAAA==",
"_self": "dbs/m2VTAA==/colls/m2VTANekt8A=/docs/m2VTANekt8ACAAAAAAAAAA==/",
"_etag": "\"0500753f-0000-1800-0000-5f735ac70000\"",
"_attachments": "attachments/",
"_ts": 1601395399
}

我可以使用以下两行用法进行插入。

var tempPartitionKey = new PartitionKey(tempProduct.ProductPartitionKey);

ItemResponse < Product > tempProductResponse = await this.container.CreateItemAsync < Product > (tempProduct, tempPartitionKey);
ItemResponse < Product > tempProductResponse = await this.container.CreateItemAsync < Product > (tempProduct);

问题是,为什么下面的方法不起作用?

var tempPartitionKey2 = new PartitionKey("/ProductPartitionKey");
ItemResponse < Product > tempProductResponse = await this.container.CreateItemAsync < Product > (tempProduct, tempPartitionKey2);

或者这个。

var tempPartitionKey3 = new PartitionKey("ProductPartitionKey");
ItemResponse<Product> tempProductResponse = await this.container.CreateItemAsync<Product>(tempProduct, tempPartitionKey3);

我在链接堆栈问题中遇到了相同的错误。

PartitionKey extracted from document doesn't match the one specified in the header

所以,最终,我想了解,我可以使用 new PartitionKey() 来使用什么字符串文字?

或者,

在当前时间点,这是设置和使用分区键的唯一方法,我不应该尝试使用直接的字符串文字值设置分区键吗?也许,这不是一个好方法,Azure Cosmos 库已经停止或删除了该功能。

最佳答案

var tempPartitionKey2 = new PartitionKey("/ProductPartitionKey");
ItemResponse < Product > tempProductResponse = await this.container.CreateItemAsync < Product > (tempProduct, tempPartitionKey2);

这不起作用,因为您没有传递分区键值,而是传递在容器中配置为分区键路径的属性名称。

当后端收到你的 item Json 时,发现该值与 item Json 的值不对应,就会出现错误。

创建项目时,操作需要项目内容以及该文档的分区键路径的值(分区键值)。这就是为什么它有效:

var tempPartitionKey = new PartitionKey(tempProduct.ProductPartitionKey);

ItemResponse < Product > tempProductResponse = await this.container.CreateItemAsync < Product > (tempProduct, tempPartitionKey);

因为您正在传递属性的值。

如果您不指定 PartitionKey 参数,SDK 需要从项目负载中提取它,这会影响性能/CPU。因此,如果可以的话,建议指定该值作为 PartitionKey 参数。

关于azure - 关于 Azure Cosmos DB 中的 CreateItemAsync 和新 PartitionKey 的混淆 - .NET Core,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64123928/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com