2016-02-18 3 views
0

Я использую Amazon DynamoDB в первый раз (и это потрясающе). Я работаю с моей моделью сохранения объектов, поэтому я использую свои собственные объекты для отправки туда и обратно. Это отлично работает на моих примитивных свойствах (строки и т. Д.). Однако у меня также есть свойство, которое представляет собой список других настраиваемых объектов, которые я хотел бы сохранить, и я не могу получить это, чтобы зафиксировать БД. Это список пользовательских объектов; каждый объект имеет несколько примитивных свойств и другой список пользовательских объектов (и на них есть только примитивы). Я нашел это: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

Хорошо, я думаю, что понял. Свойство читается только и, по-видимому, означает, что оно пропускается? Это список, и он не имеет сеттера, потому что список построен на создании объекта, и сам объект списка не должен быть действительно заменен, хотя содержимое списка часто изменяется (следовательно, необходимо хранить их в db) ,

Я добавил сеттер, и теперь он работает с моделью сохранения объекта и моим пользовательским конвертером ...

Смежные вопросы