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)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay