Используйте Autopper, чтобы установить время создания и время последнего редактирования - PullRequest
0 голосов
/ 06 октября 2018

В моем приложении 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));

Могу ли я создать общее отображение для всех классов, которые наследуются от базового класса?

Мой класс ресурсов не создан и обновленСвойства.

Спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Не имеет смысла устанавливать CREATED и UPDATED на Automapper.Во-первых, Creation Time должно быть временем сохранения записи в базе данных вместо времени отображения, во-вторых, ANAGRAFI - это новый пустой экземпляр при отображении, вы не сможете решить, будет ли это операция создания или обновления.

Для стандартного способа вы можете попытаться установить эти поля во время SaveChanges или SaveChangesAsync.

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;
    }
}
}
...