这个问题已经被问了很多次,甚至有几次答对了,我都看过了,然而,无论我做什么,它都会发生在我身上.以下是代码:

正在创建容器:

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全部是字母数字小写:"supportgpt4office ecom". PartionKeyPath相同,但前缀为‘/’,即:"/supportgpt4office ecom"(通过在调用之前记录它来验证).

有谁能给我解释一下这是怎么回事吗? 顺便说一句,我正在运行最新的CosmosDB版本: Microsoft.Azure.CosmosDB 3.37.1

推荐答案

string partitionKeyPath = $"/{_userId}";

容器的分区键定义应该是name of the property and its path,而不是值.

例如,假设您的文档具有_userId属性,则它应该是:

string partitionKeyPath = "/_userId";

当您执行项操作时,您可以正确地传递Partition Key Value,即该文档的_userId属性值.

如果属性名称不是_userId,只需将代码更改为正确的属性名称即可.

Csharp相关问答推荐

子组件:如何根据另一个组件的状态启用输入

禁用AutoSuggestBox项目更改时的动画?

在C#中使用in修饰符

LINQ无法翻译SQLFunctions方法

如何使用while循环实现异常处理

REST API端点中异步后台代码执行的类型

选取器与.NET Maui MVVM的绑定属性

创建临时Collection 最有效的方法是什么?堆栈分配和集合表达式之间的区别?

使用HttpResponseMessage中的嵌套列表初始化JSON

如何从ASP.NET核心MVC视图和Blazor传递数据

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

异步任务导致内存泄漏

C#中Java算法的类似功能

net中从位图获取坐标和绘制折线

.NET 8 DI GetServices<;对象&>不工作

避免只读记录 struct 中的防御副本

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

C#LINQ延迟执行和嵌套方法

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

现在是否有一个.NET SDK等效于AsyncEx的AsyncLock?