将NHibernate中的枚举值存储为带空格的字符串

时间:2018-01-26 09:13:01

标签: c# nhibernate enums fluent-nhibernate

我在c#中有以下枚举:

public enum AppraisalRating
{
    [Description("Please select a rating")]
    [EnumMember(Value = "N S")]
    NotSelected = -1,
    [Description("Not Rated")]
    [EnumMember(Value = "N R")]
    NotRated = 0
}

我想使用NHibernate将其存储在我的数据库中,但我想存储EnumMember属性值。如果我的映射为:

Map(x => x.Rating)

这将只存储枚举值,例如:第一项NotSelected

如果我将映射更改为:

Map(x => x.Rating).CustomType<AppraisalRating>();

然后这将存储实际的枚举值,例如-1 NotSelected代表第一项。

如何使用NHibernate存储EnumMember属性中的值?如果我的枚举值为NotSelected,我会想要“N S”。

PS。是的,由于与其他系统集成,我确实需要将空间存储在数据库中。

1 个答案:

答案 0 :(得分:0)

我最终为我的枚举编写了一个自定义类,它覆盖了NHibernate使用的方法:

public class EnumWithValuesFromEnumMember<T> : NHib.Type.EnumStringType where T : struct
{
    public EnumWithValuesFromEnumMember()
        : base(typeof(T))
    {
    }

    public override object GetInstance(object enumCode)
    {
        var codeString = (string)enumCode;
        var type = typeof(T);
        if (!type.IsEnum) throw new InvalidOperationException();
        foreach (var field in type.GetFields())
        {
            if (Attribute.GetCustomAttribute(field,
                typeof(EnumMemberAttribute)) is EnumMemberAttribute attribute)
            {
                if (attribute.Value == codeString)
                    return (T)field.GetValue(null);
            }
            else
            {
                if (field.Name == codeString)
                    return (T)field.GetValue(null);
            }
        }

        return default(T);
    }

    public override object GetValue(object enumCode)
    {
        var type = enumCode.GetType();
        var memberInfo = type.GetMember(enumCode.ToString());
        var attr = memberInfo[0].GetCustomAttributes(false).OfType<EnumMemberAttribute>().FirstOrDefault();
        return attr != null ? attr.Value : enumCode;
    }
}

我的映射为:

Map(x => x.Rating).CustomType<EnumWithValuesFromEnumMember<AppraisalRating>>();

现在我可以使用EnumMember属性。