如何使用ServiceStack.Aws将枚举插入到DynamoDb中

时间:2016-06-24 00:55:02

标签: c# servicestack amazon-dynamodb

我有一个具有枚举属性的模型,我需要在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之前调用此转换器的逻辑

那么,如何使用ServiceStack.Aws将我的枚举保存为DynamoDb中的int?

由于

1 个答案:

答案 0 :(得分:2)

我刚刚在this commit中添加了支持可配置的枚举类型,它遵循与OrmLite和ServiceStack.Text文本序列化程序相同的行为,其中默认情况下字符串序列化,除非:

使用全局配置更改枚举的默认行为:

JsConfig.TreatEnumAsInteger = true;

这是一个Flag 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]仅用于注释枚举类型,这是现在的限制。

此更改可从v4.0.61获得,现在为available on MyGet