EF Core DBContext全局配置:将所有枚举(含可空)存为字符串
EF Core全局配置所有枚举(含可空)以字符串存储的解决方案
原配置仅对非空枚举生效:
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties<Enum>().HaveConversion<string>(); }
直接配置Enum?会触发NullReferenceException,原因是Nullable<Enum>并非合法的CLR泛型类型约束,EF Core无法正确识别这种筛选逻辑。
要实现全局覆盖所有枚举(包括可空枚举),可以通过类型筛选来实现:
方案一:分两次配置(清晰直观)
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { // 处理非空枚举 configurationBuilder.Properties<Enum>() .HaveConversion<string>(); // 处理可空枚举:筛选出所有Nullable<T>且T是枚举的属性 configurationBuilder.Properties() .Where(p => p.ClrType.IsGenericType && p.ClrType.GetGenericTypeDefinition() == typeof(Nullable<>) && p.ClrType.GetGenericArguments()[0].IsEnum) .HaveConversion<string>(); }
方案二:合并为一次筛选(更简洁)
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder) { configurationBuilder.Properties() .Where(p => // 匹配非空枚举类型 p.ClrType.IsEnum // 匹配可空枚举类型 || (p.ClrType.IsGenericType && p.ClrType.GetGenericTypeDefinition() == typeof(Nullable<>) && p.ClrType.GetGenericArguments()[0].IsEnum)) .HaveConversion<string>(); }
配置完成后,实体中所有非空枚举、可空枚举属性都会自动以字符串形式存储到数据库,无需为每个枚举单独编写转换逻辑。
内容的提问来源于stack exchange,提问作者wutangcodeclan
相关产品推荐
相关产品推荐

