Entity Framework Core 7 применяет пользовательский ValueConverter к вставкам и обновлениям

Я изо всех сил пытаюсь понять, как применить пользовательский ValueConverter ко всем свойствам всех моделей перед каждой вставкой и обновлением.

По этому ресурсу это можно сделать:https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations

«Преобразователи значений позволяют преобразовывать значения свойств при чтении или ** записи ** в базу данных»

Мне удалось это сделать, но только при чтении из базы данных, переопределив ConfigureConventions в контексте:

          protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
    {
        configurationBuilder.Properties<string>().HaveConversion<ToUpperConverter>();
    }

Конвертер

          public class ToUpperConverter : ValueConverter<string, string>
    {
        public ToUpperConverter() : base(v => v, v => v.Trim().ToUpper())
        {
        }
    }

Я также пытался переопределить метод SaveChangesAsync в контексте, это работает, но, очевидно, я не хочу вручную изменять каждое свойство и каждую модель, учитывая, что они могут меняться в любое время. Использование отражения здесь может быть вариантом, но я не очень его люблю.

      public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken())
{
    foreach (var entry in ChangeTracker.Entries<Player>())
    {
        if (entry.State == EntityState.Modified || entry.State == EntityState.Added)
        {
            entry.Entity.Name = entry.Entity.Name.ToUpper();
            entry.Entity.MiddleName = entry.Entity.MiddleName?.ToUpper();
            entry.Entity.Surname = entry.Entity.Surname.ToUpper();
        }
    }
   return await base.SaveChangesAsync(cancellationToken);
}

1 ответ

Решено, потратив на это целый день. Первый аргумент конвертера - это преобразование, происходящее в базе данных, второй аргумент - преобразование, происходящее из базы данных.

      public class ToUpperConverter : ValueConverter<string, string>
{
    public ToUpperConverter() : base(
        // writing to the database
        v => v.Trim().ToUpper(),
       // reading from the database
       v => v.Trim().ToUpper())
    {
    }
}

Источник: https://learn.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.metadata.builders.propertiesconfigurationbuilder.haveconversion?view=efcore-6.0 .

«Тип, в который и из которого нужно преобразовать, или тип, наследуемый от ValueConverter».

Другие вопросы по тегам