1

ユーザープロファイルを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;
    }
}

ここで問題となるのは、ディクショナリが空で、によって空PrimitiveListが返されたToEntry場合、このディクショナリの変更が保存されないことです。

だから私が次のようなことをすると:

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; 
4

2 に答える 2

6

@jtlebiは、サービスが空の文字列または空のセットを受け入れないと正しく答えました。.NET SDKはこれに基づいて構築されており、空のPrimitiveListを保存しようとしても、SDKはこれを無視し、属性は変更されません。

ただし、属性を削除する方法はまだあります。.NETオブジェクトのフィールドをnullに設定するか、IPropertyConverter.ToEntryメソッドからnullを返します。次に、DynamoDBContext.Saveを呼び出すと、SDKはその特定の属性に対してDELETEコマンドを発行します。

于 2012-10-31T21:19:09.470 に答える
3

ValidationException空の属性を持つ要素を保存しようとすると、DynamoDBは常にを返します。

これを回避する唯一の方法は、このフィールドなしでアイテムを保存保存することです。

とはいえ、.NET SDKはわかりませんが、これが自動的に処理されないことに驚いていますか?

DynamoDBのトリッキーな制限のリストについては、http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/Limits.htmlを参照してください。

于 2012-10-31T17:57:51.220 に答える