Общая точка входа для добавления сопоставления в ядре EF - PullRequest
0 голосов
/ 17 мая 2019

Мы используем свободное отображение из отдельных файлов, используя

builder.ApplyConfigurationsFromAssembly(typeof(MyEntity).Assembly);

Кроме того, у нас есть два интерфейса ICreated и IUpdated.У нас уже есть соглашение, что они обновляются автоматически при сохранении изменений.

public void Handle(SavingChangesEvent message)
{
    var now = DateTime.UtcNow;

    foreach (var updated in message.Context.Entries<IUpdated>().Where(c => c.State == EntityState.Modified))
    {
        updated.Entity.UpdatedBy = message.Context.Username;
        updated.Entity.Updated = now;
    }
}

Хотя вам все равно необходимо вручную настроить его.Как и

builder.Property(x => x.Updated)
    .IsConcurrencyToken();

. Вы можете переместить его в метод расширения и сделать

builder.IsUpdateableEntity();

Но поскольку условно, что он обновляет даты и задает имена пользователей, мне бы это понравилось, если сопоставление такжебыло условно, чтобы он просто работал, когда вы добавляете интерфейс в новую сущность.(Разработчики уже пропустили добавление сопоставления для новых сущностей).

edit: Один из способов - использовать ApplyConfiguration и воссоздать сценарий ApplyConfigurationsFromAssembly плюс добавление пользовательских сопоставлений.Может быть, есть более встроенный способ?

решение:

builder
    .Model
    .GetEntityTypes()
    .Where(et => typeof(IUpdated).IsAssignableFrom(et.ClrType))
    .ForEach(et =>
    {
        builder.Entity(et.ClrType).Property(nameof(IUpdated.Updated)).IsConcurrencyToken();
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...