我第一次使用Amazon DynamoDB(它非常棒)。我正在使用我的对象持久性模型,所以我使用自己的对象来回发送。这对我的原始属性(字符串等)很有用。但是我还有一个属性,它是我想要存储的其他自定义对象的列表,我无法将其提交给数据库。这是一个自定义对象列表;每个对象都有一些原始属性和另一个自定义对象列表(这些对象上只有原语)。我发现了这个:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ArbitraryDataMappingHLAPI.html
并试图复制它但无法让它工作。我也在存储地图时发现了这个:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes
但是这似乎并不直接与对象一起工作,除非我遗漏了一些东西。无论如何,这是我提出的转换器:
public class AwsCommentConverter : IPropertyConverter
{
public object FromEntry(DynamoDBEntry entry)
{
PrimitiveList primList = entry as PrimitiveList;
if (primList == null)
{ throw new ArgumentOutOfRangeException(); }
List<CommentVM> comments = new List<CommentVM>();
foreach (string s in primList.AsListOfString())
{
string[] vals = s.Split(new string[] { "$~$" }, StringSplitOptions.None);
if (vals.Length < 3) throw new ArgumentOutOfRangeException();
List<StatusUpdate> updates = new List<StatusUpdate>();
for (int i = 2; i < vals.Length; i++)
{
string[] udVals = vals[i].Split(new string[] { "#@#" }, StringSplitOptions.None);
if (udVals.Length != 4) throw new ArgumentOutOfRangeException();
StatusUpdate ud = new StatusUpdate()
{
StatusType = (StatusUpdate.StatusUpdateType)Enum.Parse(typeof(StatusUpdate.StatusUpdateType), udVals[0]),
StatusDate = DateTime.FromFileTime(long.Parse(udVals[1])),
UserName = udVals[2],
NewValue = udVals[3]
};
updates.Add(ud);
}
comments.Add(new CommentVM(vals[0], vals[1], updates));
}
return comments;
}
public DynamoDBEntry ToEntry(object value)
{
List<CommentVM> comments = value as List<CommentVM>;
List<Primitive> storageVals = new List<Primitive>();
if (comments == null) throw new ArgumentOutOfRangeException();
foreach (CommentVM cm in comments)
{
string dta = cm.ID + "$~$" + cm.CommentText + "$~$";
foreach (StatusUpdate ud in cm.StatusLog)
{ dta += ud.StatusType.ToString() + "#@#" + ud.StatusDate.ToFileTime().ToString() + "#@#" + ud.UserName + "#@#" + ud.NewValue + "$~$"; }
if (dta.EndsWith("$~$"))
{ dta = dta.Substring(0, dta.Length - 3); }
storageVals.Add(new Primitive() { Value = dta });
}
return new PrimitiveList() { Entries = storageVals };
}
}
这是财产声明:
[DynamoDBProperty(typeof(AwsCommentConverter))]
public List<CommentVM> Comments
我在转换器中设置了一个断点,它似乎永远不会被击中,这让我相信我搞砸了设置它,但我不确定如何...谁能告诉我如何得到它存储和检索?
答案 0 :(得分:0)
好的,我想我明白了。该属性是只读的,显然这意味着它被跳过?它是一个列表,它没有setter,因为列表是在创建对象时构建的,并且列表对象本身不应该被真正替换,尽管列表的内容经常被修改(因此需要存储他们在db)。
我添加了一个setter,现在它可以使用对象持久性模型和我的自定义转换器......