在EF核心中添加映射的通用入口点

时间:2019-05-17 07:01:56

标签: c# entity-framework entity-framework-core

我们使用来自不同文件的流线型映射

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

最重要的是,我们有两个接口ICreatedIUpdated。我们已经有一个约定,即在保存更改时会自动更新它们。

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();
    });

0 个答案:

没有答案