【问题标题】:EF Core: Automaticall Save Enums as Strings Without Calling HasConversion For Every Single PropertyEF Core:自动将枚举保存为字符串,而不为每个属性调用 HasConversion
【发布时间】:2020-09-01 10:06:56
【问题描述】:

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

modelBuilder
    .Entity<MyEntity>()
    .Property(e => e.SomeEnumProperty)
    .HasConversion<string>();

这已经asked and answered 多次,并且在official docs 中也有描述。

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

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

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    目前(EF Core 3.1.7)除了EF CORE 2.1 HasConversion on all properties of type datetime 中描述的方法之外别无他法。

    这里的区别在于Enum类型属性的识别方式,并且由于缺乏获取实体类型构建器(这个属性构建器)的简单公共方式,直接使用SetProviderClrType元数据API而不是更直观的@987654325 @:

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

    这必须在 OnModelCreating 覆盖的末尾,或者更具体地说,在所有实体类型都为 discovered 之后。

    【讨论】:

    • 感谢您的回答!在阅读了您链接的另一个(与日期时间相关的)线程之后,在我看来,您所描述的是迄今为止可用的最佳方法。但是,将其标记为“正确答案”并不合适,因为该问题明确要求 没有 循环类型的解决方案。因此,要获得正确答案,我们必须等待未来的发布。
    • 就像official documentation 中的这个注意“目前没有办法在一个地方指定给定类型的每个属性都必须使用相同的值转换器。未来版本将考虑此功能。"?我可以轻松地复制/粘贴上述参考作为“答案”,但是整个 Q/A 对我来说毫无意义:) 无论如何,从技术上讲,你当然是对的。
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多