You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:52:40