Generi c метод настройки преобразователя перечисления строк в EF Core для всех сущностей - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь установить преобразователь значений String-Enum для всех enum свойств всех сущностей в моем проекте EF Core Code-First.

Я могу сделать это вручную следующим образом:

    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>();
    }

Но я ищу общий c способ сделать это для всех свойств с использованием метода расширения. Я попытался использовать приведенный ниже код, но получаю следующую ошибку:

Конвертер для типа модели «объект» не может использоваться для «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)));

Очевидно, потому что enum не является объектом?

Тем не менее, есть ли другой способ сделать это в общем c путь?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы можете просто использовать 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)); // <--
}
1 голос
/ 28 мая 2020

Итак, немного покопавшись, я нашел способ добиться этого. Хотя это не так просто, но дает желаемый результат.

    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>();
                }
            }
        }
    }
...