无法转换属性的范围键值

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

我正在使用带有 C# 驱动程序的 dynamoDB,并且我有一个包含用户的表。该表有以下两个主键:

  • 主哈希键:UserId(数字)
  • 主要范围键:已创建(字符串)

然后我尝试在上下文中使用 Load 方法加载用户,如下所示:

_dynamoDBClient.Context.Load<User>(12345);

然后我会遇到以下异常:

“exceptionMessage”:“无法转换属性的范围键值 创建”,“异常类型”:“System.InvalidOperationException”

如果我加载特定范围键,例如:

_dynamoDBClient.Context.Load<User>(12345, "2015-01-01");

一切都好。

即使表有范围键,是否有办法仅使用主哈希键加载键入的用户?我不想每次需要获取用户时都发送创建日期。或者我是否误解了 dynamoDB 中范围键的概念?

c# amazon-dynamodb nosql
2个回答
16
投票

Load
方法用于从表中检索单个项目,因此您需要提供整个主键。

在幕后,

Load
方法实际上从本机 AWS DynamoDB API 调用
GetItem
操作,该 API 对于需要提供的属性有以下要求:

对于主键,您必须提供所有属性。为了 例如,对于哈希类型主键,您只需要提供 哈希属性。对于哈希和范围类型的主键,您必须 提供 hash 属性和 range 属性。

来源: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html

如果您的表的主键由哈希键和范围键组成,那么您必须提供两者来匹配单个项目。

现在,当涉及到数据模型时,范围键用于对通常一起检索的相关记录进行分组。在您的情况下,我假设其他用户具有相同的

UserId
但创建日期不同。如果您不需要将用户分组在一起(并按创建日期排序),那么仅具有哈希键可能就足够了。

另外两篇文章可能会帮助您确定用于不同场景的正确密钥类型:

Dynamodb 表中的哈希范围有何用途? Dynamodb 表中的哈希范围有什么用?

什么时候使用什么PK类型? DynamoDB:何时使用什么 PK 类型?


0
投票

当你想通过 PK 直接调用一个项目时,那么你的表必须使用足够的 PK (哈希键)创建,因此在创建表时不要添加排序键..

  var sequence = await dynamoDBContext.LoadAsync<SequenceLogModel>("global_counter");
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.