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