Code First生成数据库时枚举字段被转为int类型的问题求助
解决EF反向工程中Flags枚举列被识别为int的问题
我来帮你搞定这个问题——你用Code First定义了带[Flags]特性的TypeNames枚举,映射到数据库的type列,但反向工程时EF把它识别成了int类型,对吧?结合你的TPT继承场景,给你几个可行的解决办法:
1. 反向工程后手动修正实体类
这是最直接的方式,反向工程完成后,你只需要手动修改生成的Grounds类,把int类型的type属性替换成对应的枚举类型,并加上数据注解:
[Table("gronden")] public partial class Grounds : Properties { [Column("opp")] public double? Surface { get; set; } // 把原来的int类型改成TypeNames,加上EnumDataType注解 [Column("type")] [EnumDataType(typeof(TypeNames))] public TypeNames Type { get; set; } }
别忘了确保你的TypeNames枚举在项目中可访问,并且保留[Flags]特性:
[Flags] public enum TypeNames { Een = 0, Twee = 1, Drie = 2 }
2. EF Core反向工程自定义配置(一劳永逸)
如果用的是EF Core,你可以通过自定义配置文件让脚手架自动映射枚举,不用每次手动改:
- 先创建一个
ReverseEngineeringConfiguration.json文件,内容如下:
{ "Enums": [ { "Name": "TypeNames", "UnderlyingType": "int", "Members": [ { "Name": "Een", "Value": 0 }, { "Name": "Twee", "Value": 1 }, { "Name": "Drie", "Value": 2 } ] } ], "Tables": [ { "Name": "gronden", "Columns": [ { "Name": "type", "Type": "TypeNames" } ] } ] }
- 然后执行反向工程命令时指定这个配置文件:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Config ReverseEngineeringConfiguration.json
这样EF Core会自动把gronden表的type列映射到TypeNames枚举,省了手动修改的麻烦。
3. 数据库层面添加注释(EF Core 5+适用)
从EF Core 5开始,你可以给数据库列加注释,让反向工程工具自动识别枚举类型:
- 执行下面的SQL语句给
gronden表的type列添加注释(替换成你的命名空间):
EXEC sp_addextendedproperty @name = N'MS_Description', @value = '你的命名空间.TypeNames', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'gronden', @level2type = N'COLUMN', @level2name = N'type';
之后再跑反向工程,EF Core会读取这个注释,自动把列映射到对应的枚举类型。
几个注意点
- 确保你的枚举
TypeNames的底层类型和数据库列类型一致(这里是int,和数据库的int列匹配); - 因为你的枚举带
[Flags]特性,要保证数据库列的值是按位存储的,反向工程后EF能正确处理多枚举值的组合; - 对于TPT继承的场景,反向工程会自动生成基类
Properties,别让基类的配置干扰Grounds类里枚举属性的映射。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

