如何让Entity Framework将枚举映射为SQL Server的char类型
解决Entity Framework Core中将枚举映射为SQL Server char列的问题
EF Core默认会将枚举映射为int类型列,要让你的ObjectType枚举对应SQL Server的char(1)列,可通过以下两种方式实现:
方法一:Fluent API配置(推荐)
在继承自DbContext的类中重写OnModelCreating方法,对目标实体的Type属性进行显式配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<你的实体类名称>() .Property(e => e.Type) .HasColumnType("char(1)") // 指定数据库列类型为char(1) .HasConversion( enumVal => (char)enumVal, // 把枚举值转为对应char charVal => (ObjectType)charVal // 把数据库的char转回枚举 ); }
方法二:数据注解(EF Core 5.0+支持)
在实体类的Type属性上添加注解,同时自定义一个枚举-char转换类:
1. 实体属性配置
public class 你的实体类名称 { [Column(TypeName = "char(1)")] [Conversion(typeof(CharEnumConverter<ObjectType>))] public ObjectType Type { get; set; } }
2. 自定义转换类
public class CharEnumConverter<TEnum> : ValueConverter<TEnum, char> where TEnum : struct, Enum { public CharEnumConverter() : base( enumVal => (char)(object)enumVal, charVal => (TEnum)(object)charVal) { } }
注意事项
如果数据库已经生成,你需要:
- 删除已有的迁移文件(若使用Code First迁移)
- 重新生成迁移:
Add-Migration EnumToChar(Package Manager Console)或dotnet ef migrations add EnumToChar(CLI) - 执行迁移更新数据库:
Update-Database或dotnet ef database update
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

