Мы используем свободное отображение из отдельных файлов, используя
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();
});