Olá, Rodrigo
Eu proporia uma abordagem usando código .NET puro. Imagine que você precise rastrear a data de criação e a data de última atualização de todas as entidades do seu sistema.
Para isso, você pode criar uma interface com essas duas datas, assim:
public interface ITracking
{
    DateTime Created { get; set; }
    DateTime LastUpdated { get; set; }
}
A seguir, você teria que implementar essa interface em todas as entidades onde quer controlar a data de criação e atualização.
public class Livro : ITracking
{
    public int LivroId { get; set; }
    [MaxLength(150)]
    public string Titulo { get; set; }
    public string Autor { get; set; }
    DateTime Created { get; set; }
    DateTime LastUpdated { get; set; }
}
Então você poderia modificar sua classe de contexto para sobrescrever (override) os métodos:
SaveChanges()SaveChangesAsync()
Assim, você teria como garantir que as entidades que estão sendo gravadas terão suas datas de criação/atualização modificadas
pelo método OnBeforeSaving():
public class LivrariaContext : DbContext
{
    public DbSet<Livro> Livros { get; set; }
    public override int SaveChanges(bool acceptAllChangesOnSuccess)
    {
        OnBeforeSaving();
        return base.SaveChanges(acceptAllChangesOnSuccess);
    }
    public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
    {
        OnBeforeSaving();
        return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
    }
    private void OnBeforeSaving()
    {
        var entries = ChangeTracker.Entries();
        foreach (var entry in entries)
        {
            if (entry.Entity is ITracking tracked)
            {
                switch (entry.State)
                {
                    case EntityState.Modified:
                        tracked.LastUpdated = DateTime.UtcNow;
                        break;
                    case EntityState.Added:
                        tracked.Created = 
                        tracked.LastUpdated = DateTime.UtcNow;
                        break;
                }
            }
        }
    }
}
Perceba que o método OnBeforeSaving() varre as entidades modificadas e, para cada entidade que implementa a interface
ITracking que criamos:
- Inicializa as propriedades 
Created e LastUpdated com a data e hora atuais se um novo regitro está sendo criado no banco de dados - Atualiza a propriedade 
LastUpdated com a data e hora atuais se um regitro está sendo atualizado no banco de dados 
Note que você pode mover esses métodos adicionais que criamos na classe LivrariaContext para uma classe-base,
que pode ser reaproveitada em outros projetos. Assim, sua classe de contexto ficará mais limpa e legível.