正如 comments 中所讨论的,EF Core不知道如何根据DescriptionAttribute
转换/映射Enum值.您需要实现一个Value Converter来执行映射.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var enumDescriptionMappingConverter = new ValueConverter<ItemType, string>(
v => v.ToDescription(),
v => EnumExtensions.GetValueByDescriptionAttribute<ItemType>(v));
modelBuilder.Entity<Model>()
.Property(e => e.Type)
.HasConversion(enumDescriptionMappingConverter);
}
ValueConverter
中的第一个参数是将Enum
值转换为基于DescriptionAttribute
的字符串(从模型到数据库).
ValueConverter
中的第二个参数是将存储的DB(字符串)值转换为Enum
(从DB到模型).
同时,我实现了在您的场景中所必需的extension/helper方法.
public static class EnumExtensions
{
public static string ToDescription(this Enum value)
{
var attribute = value.GetAttribute<DescriptionAttribute>();
if (attribute == null)
return value.ToString();
return attribute.Description;
}
public static TEnum GetValueByDescriptionAttribute<TEnum>(string value)
where TEnum : Enum
{
var enumDict = Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.ToDictionary(k => k, v => v.ToDescription());
return enumDict
.Single(x => x.Value == value)
.Key;
}
private static T GetAttribute<T>(this Enum value)
where T : Attribute
{
Type type = value.GetType();
MemberInfo[] memberInfo = type.GetMember(value.ToString());
var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
return (T)attributes.FirstOrDefault();
}
}