这个问题已经被问过很多次了,甚至回答正确过几次,我都看过了,但是,无论我做什么,它都会发生在我身上。这是代码:
创建容器:
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
string partitionKeyPath = $"/{_userId}";
容器的分区键定义应具有 属性名称及其路径,而不是值。
例如,假设您的文档具有
_userId
属性,那么它应该是:
string partitionKeyPath = "/_userId";
当您执行项目操作时,按照正确操作,传递 Partition Key Value,即该文档的
_userId
属性的值。
如果属性名称不是
_userId
,只需更改代码以获得正确的属性名称。