EF Core如何实现枚举与数据库中Description属性值的映射?
解决EF Core中枚举与Description属性值的映射问题
报错System.InvalidOperationException: 无法将数据库中的字符串值'i'转换为映射的'ItemType'枚举值的核心原因是:EF Core默认的枚举转字符串逻辑,是使用枚举的名称(比如Floor、Wall)或数值,而非你定义的Description属性值。要实现数据库存储Description值与枚举的映射,需要自定义值转换器。
步骤1:编写枚举与字符串的双向转换逻辑
先实现枚举和Description字符串的转换工具方法:
using System.ComponentModel; using System.Reflection; public static class EnumDescriptionConverter { // 从枚举值获取对应的Description字符串 public static string GetDescription(Enum enumValue) { FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); return attributes.Length > 0 ? attributes[0].Description : enumValue.ToString(); } // 从Description字符串获取对应的枚举值 public static T GetEnumFromDescription<T>(string description) where T : Enum { foreach (var field in typeof(T).GetFields()) { if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute) { if (attribute.Description == description) return (T)field.GetValue(null); } // 兼容字符串为枚举名称的情况 else if (field.Name == description) return (T)field.GetValue(null); } // 无匹配时抛出异常,也可根据需求返回默认值 throw new ArgumentException($"未找到Description为'{description}'的{typeof(T).Name}枚举值"); } }
步骤2:在EF Core中配置自定义转换器
修改实体映射代码,用自定义转换器替换默认的HasConversion<string>:
modelBuilder.Entity<Item>() .Property(e => e.Type) .HasConversion( // 枚举转数据库存储的字符串(取Description) enumValue => EnumDescriptionConverter.GetDescription(enumValue), // 数据库字符串转枚举(匹配Description) dbValue => EnumDescriptionConverter.GetEnumFromDescription<ItemType>(dbValue) );
额外注意
- 若数据库可能存在无效字符串,可在
GetEnumFromDescription中返回default(T)避免抛出异常,但建议在数据入库阶段就保证值的合法性。 - 注意映射代码中的实体类需与实际定义一致(你原代码中写的是
ItemDto,需确认是否为笔误)。
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

