2016-06-24 4 views
2

У меня есть модель, которая имеет свойство enum, и мне нужно сохранить эту модель с этим свойством в DynamoDb, но как целое, а не string (поведение по умолчанию в ServiceStack.Aws).Как вставить enum as int в DynamoDb с ServiceStack.Aws

В пространстве имен ServiceStack.DataAnnotations имеется атрибут «EnumAsInt». Я помещаю этот атрибут в свою модель, но не работаю. В настоящее время я получаю сообщение об ошибке, которое говорит, что мой индекс ожидает целое число, но я отправил строковое значение.

Моя модель выглядит следующим образом

[References(typeof(PersonContactIndex))] 
    [Alias("PersonContact")] 
    public class PersonContact 
    { 
     [AutoIncrement] 
     public int PersonContactId { get; set; } 

     public int PersonId { get; set; } 

     [EnumAsInt] 
     public PersonContactType ContactType { get; set; } 
     public string Value { get; set; } 
     public bool IsDefault { get; set; } 
    } 

Моего индекс выглядит как этот

public class PersonContactIndex: IGlobalIndex<PersonContact> 
    { 
     [HashKey] 
     public int PersonId { get; set; } 

     [RangeKey] 
     [EnumAsInt] 
     public PersonContactType ContactType { get; set; } 

     public int PersonContactId { get; set; } 
    } 

Другим способ может быть настраивает пользовательский конвертер, который AWSSDK поддержки, но я не знаю, если ServiceStack имеет логику для вызова этого конвертера перед отправкой запроса в DynamoDB

Итак, как я могу сохранить свои перечисления как int в DynamoDb с ServiceStack.Aws?

Благодаря

ответ

2

Я только что была добавлена ​​поддержка настраиваемых типов Enum в this commit, который следует за такое же поведение, как OrmLite и ServiceStack.Text текст сериализаторов где Enum являются сериализовать строками по умолчанию, если только:

поведение по умолчанию Перечисления из меняется с глобальной конфигурации:

JsConfig.TreatEnumAsInteger = true; 

Это флаг Enum:

[Flags] 
enum SuitsFlags 
{ 
    Spades = 1, 
    Clubs = 2, 
    Diamonds = 4, 
    Hearts = 8 
} 

Или перечисление с аннотацией [EnumAsInt], например:

[EnumAsInt] 
enum Suits 
{ 
    Spades, 
    Clubs, 
    Diamonds, 
    Hearts 
} 

Вы также можете настроить, как преобразуется каждое значение путем регистрации преобразователя пользовательское значение, реализующий IAttributeValueConverter, например:

DynamoMetadata.Converters.ValueConverters[typeof(Suits)] = 
    new MySuitsEnumConverter(); 

[EnumAsInt] предназначен только для аннотирования типов перечислений, которые теперь ограничены.

Это изменение доступно из версии 4.0.61, которая сейчас находится available on MyGet.

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