使用 space 在 NHibernate 中将枚举值存储为字符串

Storing an enum value in NHibernate as a string with space

我在 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 属性的值?所以我想要 "N S" 如果我的枚举值为 NotSelected.

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

我最终为我的枚举写了一个自定义 class,它覆盖了 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 属性了。