繁体   English   中英

关于 Azure Cosmos DB 中的 CreateItemAsync 和 new PartitionKey 的困惑 - .NET Core

[英]Confusion about CreateItemAsync and new PartitionKey in Azure Cosmos DB - .NET Core

我正在尝试使用 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() 使用什么字符串文字?

或者,

是不是这样,在当前时间点,这是设置和使用分区键的唯一方法,我不应该尝试使用直接的字符串文字值设置分区键? 或许,这不是一个好办法,蔚蓝宇宙图书馆已经停止或移除了那个能力。

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

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

当后端收到您的项目 Json 并发现该值与项目 Json 所具有的值不对应时,就会出现错误。

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

var tempPartitionKey = new PartitionKey(tempProduct.ProductPartitionKey);

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

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

如果您未指定 PartitionKey 参数,则 SDK 需要从项目负载中提取它,这会对性能/CPU 造成影响。 所以建议,如果可以,将值指定为 PartitionKey 参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM