我将用户配置文件保存在DynamoDB中,并使用属性将.net类型转换为dynamo条目
这是我使用的转换器
public class DictRoomClassHouseInfoConverter : IPropertyConverter
{
...
public DynamoDBEntry ToEntry(object value)
{
var dictionary = value as Dictionary<RoomClass, HouseInfo>;
if (dictionary == null)
{
throw new ArgumentException("Invalid type");
}
var entry = new PrimitiveList();
foreach (var kvp in dictionary)
{
entry.Add(new Primitive { Value = string.Format("{0}|{1}|{2}", (int)kvp.Key, kvp.Value.House, kvp.Value.TimesSold) });
}
return entry;
}
}
现在的问题是,当字典为空并且ToEntry
返回空的PrimitiveList
时,将不保存对该字典的更改
所以如果我这样做:
var profile = GetProfile(id);
//profile.DictProp has 3 items;
profile.DictProp.Clear();
//profile.DictProp has 0 items;
SaveProfile(profile);
var p = GetProfile(id);
//profile.DictProp has 3 items;
2条答案
按热度按时间laik7k3q1#
@jtlebi正确地回答了服务不接受空字符串或空集,.NET SDK建立在此基础上,因为如果您试图保存空PrimitiveList,SDK将忽略这一点,并且属性不会更改。
但是,仍然有一种方法可以删除属性:将.NET对象上的字段设置为null或从IPropertyConvert.ToEntry方法返回null。然后,当您调用DynamoDBContext.保存时,SDK将为该特定属性发出DELETE命令。
inb24sb22#
如果您试图保存一个属性为空的元素,DynamoDB将始终返回一个
ValidationException
。避免此问题的唯一方法是保存不带此字段的项目。
也就是说,我不知道.NET SDK,但我很惊讶它不能自动处理这个问题?
有关DynamoDB棘手限制的列表,请参见http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/Limits.html。