簡體   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