【问题标题】:Use automapper to set creation time and last edit time使用 automapper 设置创建时间和最后编辑时间
【发布时间】:2018-10-06 09:48:33
【问题描述】:

在我的 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 属性。

谢谢。

【问题讨论】:

标签: asp.net-core-mvc automapper


【解决方案1】:

Automapper 设置CREATEDUPDATED 是不合理的。首先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;
    }
}
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多