[英]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
(改进 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.