我在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。是的,由于与其他系统集成,我确实需要将空间存储在数据库中。
答案 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
属性。