簡體   English   中英

在 EF Core 中為所有實體設置字符串枚舉轉換器的通用方法

[英]Generic method for setting string enum converter in EF Core for all entities

我正在嘗試將字符串枚舉值轉換器設置為我的 EF Core Code-First 項目中所有實體的所有enum屬性。

我可以像這樣手動執行此操作:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Do this for every single enum property in each of the entities
        modelBuilder.Entity<MyEntity>().Property(e => e.MyEnum).HasConversion<string>();
    }

但我正在尋找一種使用擴展方法為所有屬性執行此操作的通用方法。 我嘗試使用以下代碼,但出現以下錯誤:

model 類型“對象”的轉換器不能用於“MyEnum”

    public static void SetEnumStringConverter(this ModelBuilder modelBuilder)
    {
        var properties = modelBuilder?.Model.GetEntityTypes().SelectMany(x => x.GetProperties().Where(y => typeof(Enum).IsAssignableFrom(y.ClrType)));
        foreach (var property in properties)
        {
            property.SetValueConverter(new ValueConverter<object, string>(v => v.ToString(), v => (object)Enum.Parse(property.ClrType, v)));
        }
    }

還嘗試了以下,給了我同樣的錯誤

    property.SetValueConverter(new ValueConverter<Enum, string>(v => v.ToString(), v => Enum.Parse(property.ClrType, v)));

顯然是因為枚舉不是 object?

然而,有沒有其他方法可以通用的方式做到這一點?

所以,經過一番挖掘,我找到了實現這一目標的方法。 雖然不簡單,但得到了想要的結果。

    public static void SetEnumStringConverter(this ModelBuilder modelBuilder)
    {
        foreach (var entityType in modelBuilder?.Model.GetEntityTypes())
        {
            var entityBuilder = modelBuilder.Entity(entityType.ClrType);
            foreach (var property in entityType.GetProperties())
            {
                if (typeof(Enum).IsAssignableFrom(property.ClrType))
                {
                    entityBuilder.Property(property.ClrType, property.Name).HasConversion<string>();
                }
            }
        }
    }

您可以簡單地使用SetProviderClrType擴展方法,例如

public static void SetEnumStringConverter(this ModelBuilder modelBuilder)
{
    var properties = modelBuilder.Model.GetEntityTypes()
        .SelectMany(e => e.GetProperties())
        .Where(p => (Nullable.GetUnderlyingType(p.ClrType) ?? p.ClrType).IsEnum);

    foreach (var property in properties)
       property.SetProviderClrType(typeof(string)); // <--
}

暫無
暫無

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

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