DynamoDB NULL值转换失败:如何允许字符串属性存NULL?
解决DynamoDB.NET SDK中NULL属性转换失败问题
问题重现
你的DynamoDB数据模型定义如下:
public class ChallengePart_dynamoDB { [DynamoDBProperty("numPlayers")] public string NumPlayers { get; set; } [DynamoDBProperty("header")] public string Header { get; set; } }
使用以下代码扫描数据:
try { var model = await dynamoDBContext.ScanAsync<ChallengePart_dynamoDB>( null ).GetRemainingAsync(); } catch (Exception e) { }
当表中numPlayers或header属性为DynamoDB NULL时,抛出转换错误:
"Unable to convert [Amazon.DynamoDBv2.DocumentModel.DynamoDBNull] of type Amazon.DynamoDBv2.DocumentModel.DynamoDBNull to System.String"
将属性改为可空字符串string?后问题仍未解决。
解决方案
方法1:为单个属性添加自定义转换器
创建一个处理DynamoDBNull与.NET null转换的转换器类:
using Amazon.DynamoDBv2.DataModel; using Amazon.DynamoDBv2.DocumentModel; public class NullableStringConverter : IPropertyConverter { public object FromEntry(DynamoDBEntry entry) { return entry is DynamoDBNull ? null : entry.AsString(); } public DynamoDBEntry ToEntry(object value) { return value == null ? DynamoDBNull.Value : new Primitive((string)value); } }
然后在模型的目标属性上指定该转换器:
public class ChallengePart_dynamoDB { [DynamoDBProperty("numPlayers", typeof(NullableStringConverter))] public string? NumPlayers { get; set; } [DynamoDBProperty("header", typeof(NullableStringConverter))] public string? Header { get; set; } }
方法2:全局配置所有字符串属性的转换规则
如果希望项目中所有字符串属性都自动处理DynamoDBNull,可以在初始化DynamoDBContext时添加全局转换器:
var contextConfig = new DynamoDBContextConfig { Conversion = new ConversionConfig { CustomConverters = new List<IPropertyConverter> { new NullableStringConverter() } } }; var dynamoDBContext = new DynamoDBContext(yourDynamoDBClient, contextConfig);
关键说明
- .NET的可空字符串
string?语法本身没问题,但AWS SDK默认不会将DynamoDBNull映射为.NET null,必须通过转换器显式处理这种类型转换。 - 如果属性在DynamoDB中不存在,SDK会自动将.NET属性设为null,无需额外处理;只有当属性存在但值为DynamoDBNull时才需要转换器。
内容的提问来源于stack exchange,提问作者Kasper Sommer
相关产品推荐
相关产品推荐

