当前代码 Cosmos DB 3.37.1:PartitionKey 键不匹配异常

问题描述 投票:0回答:1

这个问题已经被问过很多次了,甚至回答正确过几次,我都看过了,但是,无论我做什么,它都会发生在我身上。这是代码:

创建容器:

string partitionKeyPath = $"/{_userId}";
_container = await database.CreateContainerIfNotExistsAsync(_containerName, partitionKeyPath);

然后当添加我的聊天对象时:

if (_container != null)
{
    Chat? chat;
    bool newChatCreated = false;
    try
    {
        // Attempt to read the Chat item. If it exists, add the ChatItem to it.
        chat = await _container.ReadItemAsync<Chat>(chatId, new PartitionKey(_userId)).ConfigureAwait(false);
    }
    catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
    {
        // If the Chat item does not exist, create a new one.
        chat = new Chat
        {
            id = chatId,
            _userId = _userId,
            ChatItems = new List<ChatItem>(),
            ChatName = chatName,
            IndexName = indexName,
            TimeCreated = DateTime.Now.ToString("yyyy/MM/dd-HH:mm:ss.fff")
        };

        ContainerProperties props = await _container.ReadContainerAsync();
        _logger.LogInformation($"PartitionKeyPath: {props.PartitionKeyPath}");

// Exception happens on the next line in CreateItemAsync !!!
        await _container.CreateItemAsync<Chat>(chat, new PartitionKey(_userId));

        newChatCreated = true;
    }

    chat?.ChatItems?.Add(chatItem);

    if (newChatCreated)
    {
        // Update the Chat item in the database
        await _container.ReplaceItemAsync<Chat>(chat, chatId, new PartitionKey(_userId));
    }
    else
    {
        var patchOperations = new List<PatchOperation>
        {
            PatchOperation.Add("/ChatItems/-", chatItem)
        };
        await _container.PatchItemAsync<Chat>(chatId, new PartitionKey(_userId), patchOperations);
    }
}
else
{
    _logger.LogError("_container is null");
    return false;
}

充当 PartitionKey 的 _userId 全部为字母数字小写形式:“supportgpt4officecom”。 PartionKeyPath 是相同的,但前面带有“/”,即:“/supportgpt4officecom”(通过在调用之前记录它来验证。)

那么,有人可以向我解释发生了什么事吗? 顺便说一句,我正在运行最新的 CosmosDB 版本: 微软.Azure.CosmosDB 3.37.1

c# azure azure-cosmosdb partition
1个回答
1
投票
string partitionKeyPath = $"/{_userId}";

容器的分区键定义应具有 属性名称及其路径,而不是值。

例如,假设您的文档具有

_userId
属性,那么它应该是:

string partitionKeyPath = "/_userId";

当您执行项目操作时,按照正确操作,传递 Partition Key Value,即该文档的

_userId
属性的值。

如果属性名称不是

_userId
,只需更改代码以获得正确的属性名称。

© www.soinside.com 2019 - 2024. All rights reserved.