簡體   English   中英

將 EF Core 3.1 轉換為存儲字符串枚舉值,而不是整數

[英]Transition EF Core 3.1 to storing string enum values, rather than ints

我想知道對於將枚舉值存儲為整數的現有數據庫的問題是否有一個優雅的解決方案,但想要過渡到存儲新記錄的字符串,但將整數單獨留在舊記錄中。 自然地,我們可以將列類型從 int 變為 string,而表示“Ready”的“2”仍然可以存儲在 string 列中。

是否有一種技術允許 EF 在enum Status { Ready = 2 }中將“2”或“Ready”解析為該Status.Ready 我知道 EF Core 有一個 EnumStringConverter 可以理解"Ready" -> Status.Ready但是有沒有辦法擴展或自定義它,以便它嘗試雙向解析 db 值? (“Ready”作為枚舉元素名稱 -> 成功,“2”作為枚舉元素名稱 -> 失敗,“2”作為枚舉元素值 -> 成功)我們是否會編寫一個轉換過程,例如檢查數據庫中的所有字符值是數字,因此將其解析為值,否則將其解析為名稱?

或者從使用整數切換到使用字符串的人是否也編寫了大量遷移來更新每個枚舉列中的每個值,以便所有現有的“2”都變成“就緒”?

您可以使用自定義轉換器,如下所示

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<MyEntity>()
        .Property(e => e.MyStatusColumn)
        .HasConversion(
            v => v.ToString(),
            v => int.TryParse(v, out int val) ? 
                 (Status)val : 
                 (Status)Enum.Parse(typeof(Status), v)
        );
}

根據我自己的實踐,我將枚舉值作為 int 存儲在數據庫中。 為了在客戶端進行演示,我做了以下技巧。

在具有枚舉屬性 Status 的實體 class 中,創建另一個獲取該枚舉字符串值的屬性:

 public enum Status
 {
    None,
    Ready,
    InProcess,
    NotReady
 }

 public class Process
 {
    public int Id { get; set; }
    public Status Status { get; set; }
    public string GetStatus 
    {
        get
        {
            return Status.ToString();
        }
    }
 }

在這里,如果您的 Process object 的 Status 屬性值為 1,則 GetStatus 屬性僅返回 Ready 字符串。

希望,這回答了你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM