Entity framework core EF Core:自动调用将枚举另存为字符串,而无需为每个属性调用HasConversion

Entity framework core EF Core:自动调用将枚举另存为字符串,而无需为每个属性调用HasConversion,entity-framework-core,Entity Framework Core,使用EF Core,我可以告诉modelBuilder将具有枚举类型的属性保存为字符串: modelBuilder .实体() .Property(e=>e.SomeEnumProperty) .HasConversion(); 这已经进行了多次,并且在中也进行了描述 但是,我的项目中使用的实体类型(modelBuilder.Model.GetEntityTypes())及其子类型的列表相当长,我认为它很容易出错,会遍历所有托管实体,通过反射递归地获取它们的属性及其子属性,并半手动地添加字符串

使用EF Core,我可以告诉modelBuilder将具有枚举类型的属性保存为字符串:

modelBuilder
.实体()
.Property(e=>e.SomeEnumProperty)
.HasConversion();
这已经进行了多次,并且在中也进行了描述

但是,我的项目中使用的实体类型(
modelBuilder.Model.GetEntityTypes()
)及其子类型的列表相当长,我认为它很容易出错,会遍历所有托管实体,通过反射递归地获取它们的属性及其子属性,并半手动地添加字符串转换

是否有使用
StringEnumConverter
将所有枚举属性值自动保存为字符串的内置方法?

目前(EF Core 3.1.7)除中所述的方法外,没有其他方法

这里的区别在于识别枚举类型属性的方式,并且由于缺少获取实体类型生成器(此属性生成器)的简单公共方式,直接使用元数据API而不是更直观的
hascoveration

foreach(modelBuilder.Model.GetEntityTypes()中的var entityType)
{
foreach(entityType.GetProperties()中的var属性)
{
var propertyType=Nullable.GetUnderlyingType(property.ClrType)??property.ClrType;
if(propertyType.IsEnum)
SetProviderClrType(typeof(string));
}
}

这必须是在您的
OnModelCreating
覆盖结束时,或者更具体地说,在所有实体类型都完成之后。

谢谢您的回答!在阅读了您链接的另一个(与日期时间相关的)线程之后,我觉得您所描述的是目前可用的最佳方法。但是,将其标记为“正确答案”是不对的,因为该问题明确要求解决方案,而没有循环类型。因此,为了得到正确的答案,我们必须等待未来的放松。如中的注释:“目前无法在一个位置指定给定类型的每个属性必须使用相同的值转换器。此功能将在未来的版本中考虑。”?我可以很容易地复制/粘贴上面的参考资料作为“答案”,但是整个问答对我来说毫无意义:)无论如何,从技术上来说,你当然是对的。