我有一个具有枚举属性的模型,我需要在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?
由于
答案 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。