使用自动映射器设置创建时间和上次编辑时间

时间:2018-10-06 09:48:34

标签: asp.net-core-mvc automapper

在我的MVC Core 2应用程序中,我使用Automapper将资源类映射到dto类。
我的某些dto类继承自具有以下属性的基类:

ID
CREATED
UPDATED

我为一个继承的类创建了这种映射:

            CreateMap<AnagraficaCompletaResource, ANAGRAFI>()
            .ForMember(d => d.CREATED, option => { option.Condition(s => {return (s.ID == 0);}); option.MapFrom(s => DateTime.Now);})
            .ForMember(d => d.UPDATED, opt => opt.MapFrom(s => DateTime.Now));

我可以为从基类继承的所有类创建通用映射吗?

我的资源类没有Created和Updated属性。

谢谢。

1 个答案:

答案 0 :(得分:1)

通过CREATED设置UPDATEDAutomapper是不合理的。首先,Creation Time应该是将记录保存到数据库中的时间,而不是映射时间,其次,ANAGRAFI是映射时的新空实例,您将无法决定是创建记录还是创建记录更新操作。

对于标准方式,您可以尝试在SaveChangesSaveChangesAsync期间设置这些字段。

BaseEntity

public class BaseEntity
{
    public DateTime? DateCreated { get; set; }
    public DateTime? DateModified { get; set; }
}

SchoolContext

public class SchoolContext : DbContext
{
public DbSet<Student> Students { get; set; }

public override int SaveChanges()
{
    SetCreatedAndModified();
    return base.SaveChanges();
}

public override async Task<int> SaveChangesAsync()
{
    SetCreatedAndModified();
    return await base.SaveChangesAsync();
}

private void SetCreatedAndModified()
{
    var entities = ChangeTracker.Entries().Where(x => x.Entity is BaseEntity && (x.State == EntityState.Added || x.State == EntityState.Modified));       

    foreach (var entity in entities)
    {
        if (entity.State == EntityState.Added)
        {
            ((BaseEntity)entity.Entity).DateCreated = DateTime.UtcNow;
        }

        ((BaseEntity)entity.Entity).DateModified = DateTime.UtcNow;
    }
}
}