1
resposta

Sobre a trigger

Uma dúvida,

No curso temos o caso da coluna last_update. O entity possui suporte de atualizar o valor da coluna last_update com a data atual para todo update. A solução orientada pelo entity seria: 1 criar uma trigger. Poderiamos criar essa trigger do na mesma estratégia que foi feito com a constraint check ou não seria uma boa prática?

1 resposta

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.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software