DEV Community

👨‍💻 Lucas Silva
👨‍💻 Lucas Silva

Posted on

Uma forma simples de realizar soft delete em .Net utilizando Entity Framework Core

Ao desenvolver APIs, é comum ter de alterar o comportamento de DELETE para que, em vez de excluir o registro, simplesmente alterar uma propriedade booleana e considerar que aquele recurso não existe caso o valor da propriedade seja false. Essa técnica é conhecida como "Soft Delete".

Há várias formas de implementar esse comportamento. A forma apresentada neste texto pode ser resumida aos seguintes passos:
1- Adicionar uma propriedade booleana à classe desejada;
2- Sobrescrever o método SaveChangesAsync da classe que estende DbContext;
3- Adicionar um filtro na configuração da entidade para que as entidades "inativas" não sejam retornadas em queries.

Adicionar propriedade booleana

O primeiro passo é autoexplicativo. Crie uma entidade e adicione a propriedade booleana a ela. Caso várias entidades precisem desse comportamento, considere criar uma classe base ou interface que a contenha.

Sobrescrever o método SaveChangesAsync

Se você utiliza o EF, é provável que tenha estendido a classe DbContext para criar um contexto próprio. A classe base possui um método chamado SaveChangesAsync, o qual salva as alterações feitas no banco de dados.

A alteração que será realizada no método visa detectar o estado das entidades rastreadas pelo ChangeTracker. Caso alguma tenha sido deletada, será necessário mudar o estado dela para Unchanged (em vez de Deleted), e então alterar a propriedade booleana adicionada no passo anterior.

public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default)
{
    foreach (var entry in ChangeTracker.Entries<T>()) // Onde "T" é o tipo da entidade
    {
        switch (entry.State)
        {
            case EntityState.Deleted:
                entry.State = EntityState.Unchanged;
                entry.Entity.PropriedadeBooleana = false; // Prefira utilizar um método para isso.
                break;
        }
    }
    return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
Enter fullscreen mode Exit fullscreen mode

Adicionar filtro

Com a alteração feita, já é possível alterar todas as queries para que elas deconsiderem entidades às quais o valor da propriedade booleana seja false. Entretanto, dependendo do tamanho da sua aplicação, essa tarefa poderá ser bastante trabalhosa.

Para evitar a situação descrita acima, o EF fornece uma forma de realizar isso de forma automática através da configuração da entidade. Exemplo:

public class SuaEntidadeConfiguration: IEntityTypeConfiguration<SuaEntidade>
{
    public void Configure(EntityTypeBuilder<SuaEntidade> builder)
    {
        builder.HasQueryFilter(x => x.Active);
    }
}
Enter fullscreen mode Exit fullscreen mode

O código acima faz com que somente as entidades que possuam a propriedade Active como true sejam retornadas em caso de queries.

Chegamos ao fim do tutorial. Espero que este texto tenha sido o suficiente para a implementação de um comportamento básico de Soft delete na sua aplicação.

API Trace View

How I Cut 22.3 Seconds Off an API Call with Sentry 👀

Struggling with slow API calls? Dan Mindru walks through how he used Sentry's new Trace View feature to shave off 22.3 seconds from an API call.

Get a practical walkthrough of how to identify bottlenecks, split tasks into multiple parallel tasks, identify slow AI model calls, and more.

Read more →

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay