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())
{
}
}
«Тип, в который и из которого нужно преобразовать, или тип, наследуемый от ValueConverter».