使用 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
属性了。
我在 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
属性了。