我们使用来自不同文件的流线型映射
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
的特性,再添加customi映射。也许有更多的内置方式?
解决方案:
builder
.Model
.GetEntityTypes()
.Where(et => typeof(IUpdated).IsAssignableFrom(et.ClrType))
.ForEach(et =>
{
builder.Entity(et.ClrType).Property(nameof(IUpdated.Updated)).IsConcurrencyToken();
});