繁体   English   中英

带枚举到字符串值转换的 EF Core 的默认值

[英]Default values for EF Core with enum to string Value Conversion

EF Core 2.1+ 支持值转换 您可以使用内置的EnumToStringConverter<>自动将 Enum 转换为字符串,反之亦然。

我正在连接到现有数据库,并希望将其中一个列转换为枚举,因此EnumToStringConverter<>似乎正合我意。 但是,数据库也不在我的控制范围内(我只有读取权限),所以如果有人向表中插入一行,其字符串值与我的任何枚举定义都不匹配,会发生什么情况?

最好我希望将任何未知值映射到Unknown枚举值,但除了手动创建我自己的ValueConverter object 之外,我找不到任何关于如何执行此操作的文档,我在其中实现了我自己的所有字符串值的手动解析和map 它们到适当的枚举值。 这似乎有点麻烦并且增加了额外的维护,所以我非常想在这里进行一些自动化......这意味着如果在数据库中找到未知的字符串值,EFCore 会自动将其映射到我的自定义Unknown枚举值。

这可能吗?

如果我理解正确,这应该可以解决问题:

 entity.Property(e => e.MyEnumField)
        .HasMaxLength(50)
        .HasConversion(
                v => v.ToString(),
                v => {


                if(Enum.TryParse(v,true,out var res)){
                return res;
                }

                return MyEnum.Default;

                })
               .IsUnicode(false);

我没有测试过这个。

来源: https : //docs.microsoft.com/en-us/dotnet/api/system.enum.tryparse?view=netframework-4.8

https://entityframeworkcore.com/knowledge-base/44262314/how-can-i-make-ef-core-database-first-use-enums-

(改进 vsarunov 的答案,正如评论中提到的那样,它不起作用)
如果您使用单独的方法进行解析:

private MyEnumType ParseEnum(string input)
{
    if (Enum.TryParse<MyEnumType>(input, true, out var res))
        return res;

    return default;
}

然后你可以在你的转换器中使用它:

 entity.Property(e => e.MyEnumField)
        .HasMaxLength(50)
        .HasConversion(
                v => v.ToString(),
                v => ParseEnum(v)); 

您可能更喜欢,尤其是当您需要转换多个枚举类型时,创建一个通用扩展方法来进行解析:

public static T ToEnum<T>(this string input) where T : struct
{
    if (Enum.TryParse<T>(input, true, out var res))
        return res;
    return default;
}

然后在你的转换器中:

 entity.Property(e => e.MyEnumField)
        .HasMaxLength(50)
        .HasConversion(
                v => v.ToString(),
                v => v.ToEnum<MyEnumType>()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM