EF Core调用FirstOrDefault查询时如何将数据库字符串转为枚举值
EF Core 枚举存储为字符串的配置方法
EF Core 默认将枚举类型映射为数据库中的int类型存储,要改为存储枚举对应的字符串值、同时查询时自动完成字符串到枚举的类型转换,可通过以下两种方式配置,配置后所有查询方法(包括FirstOrDefault)都不会再出现类型映射错误。
方法1:特性注解配置
直接在实体类的枚举属性上标注特性完成配置,需要先引用EF Core值转换相关命名空间:
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using System.ComponentModel.DataAnnotations.Schema; public enum MyEnum { value1, value2, value3 } public class MyClass { public int Id; // 指定数据库列类型为字符串,绑定枚举-字符串自动转换器 [Column(TypeName = "nvarchar(50)")] [ValueConverter(typeof(EnumToStringConverter<MyEnum>))] public MyEnum myEnum; }
方法2:Fluent API 配置(全版本兼容,推荐)
如果不想在实体类中引入EF Core相关的特性依赖,可以在DbContext的模型配置方法中统一设置,不需要修改实体类代码:
using Microsoft.EntityFrameworkCore; public class YourDbContext : DbContext { public DbSet<MyClass> MyClases { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyClass>() .Property(x => x.myEnum) .HasConversion<string>() // 内置方法自动实现枚举与字符串的双向转换 .HasMaxLength(50); // 根据枚举值的实际长度设置列长度,减少存储空间浪费 } }
注意事项
- 配置完成后EF Core会自动处理双向转换:写入数据时将枚举转为对应的名称字符串存储,查询数据时自动将数据库字符串映射为对应枚举值,无需手动写转换逻辑。
- 如果数据库中已经存在之前存储的数字类型枚举值,需要先完成迁移将对应列类型修改为字符串,再将存量数据转换为对应的枚举名称字符串,否则查询存量数据会出现转换失败的问题。
- 配置完成后原有查询代码不需要做任何修改,
var myClass = context.MyClases.FirstOrDefault(x => x.Id == Id);可以直接正常使用。
内容的提问来源于stack exchange,提问作者kokon231
相关产品推荐
相关产品推荐

