Removendo recursos e filhos
Resumo
DELETEremove um recurso e deve responder204 No Contentem caso de sucesso. Ao remover um pai, o comportamento em cascata do EF Core cuida dos filhos.
1. Objetivos de Aprendizagem#
- Implementar
DELETEretornando204 No Content. - Entender o efeito do
DeleteBehavior.Cascadesobre filhos. - Reutilizar a validação de existência da Service Layer.
2. Pré-requisitos#
- Recurso único e exceções de domínio (Módulo 20).
3. Conceito#
DELETE é idempotente: remover o mesmo recurso repetidamente resulta no mesmo estado final. A resposta idiomática de sucesso é 204 No Content (sem corpo). O porquê de 204: a operação teve sucesso e não há representação a devolver.
Quando o pai é removido e o relacionamento está configurado como Cascade (Módulo 17), o EF Core remove os filhos automaticamente.
4. Mão na Massa#
4.1. Setup#
Reuse repositórios e handler global.
4.2. Implementação Passo a Passo#
- Serviço de remoção:
public async Task DeleteAsync(Guid categoriaId, bool trackChanges)
{
var categoria = await _repo.Categoria.GetByIdAsync(categoriaId, trackChanges)
?? throw new CategoriaNotFoundException(categoriaId);
_repo.Categoria.Delete(categoria); // filhos vão junto se Cascade
await _repo.SaveAsync();
}
- Controller:
[HttpDelete("{id:guid}")]
public async Task<IActionResult> Deletar(Guid id)
{
await _service.Categoria.DeleteAsync(id, trackChanges: false);
return NoContent();
}
4.3. Executando#
curl -i -X DELETE http://localhost:5000/api/categorias/{id}
# HTTP/1.1 204 No Content
5. Exemplo Completo#
Ao deletar um produto individual, o serviço valida a categoria e o produto (pertencimento) antes de remover, mantendo integridade referencial.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Retornar 204 No Content em sucesso | Retornar 200 com corpo desnecessário |
| Definir explicitamente o comportamento de cascata | Assumir cascata e apagar filhos sem querer |
| Validar existência antes de deletar | Chamar Delete em entidade não rastreada/inexistente |
Atençãocascata pode apagar mais do que você imagina. Em dados críticos, considere soft delete (marcar como inativo) em vez de remoção física.
7. Segurança e Produção#
- Exija autorização adequada para
DELETE(Módulo 40) — é uma operação destrutiva. - Para auditoria e recuperação, soft delete costuma ser preferível à remoção definitiva.
8. Exercícios#
- Fácil: implemente
DELETEde um produto específico. - Médio: troque a remoção física por soft delete (
Ativo = false) e filtre inativos nas leituras. - Desafio: registre uma auditoria (quem/quando) de cada remoção.
9. Resumo#
DELETE é idempotente e responde 204. A validação de existência fica no serviço e o comportamento de cascata do EF Core governa a remoção de filhos — com soft delete como alternativa mais segura.
10. Próximos Passos#
Módulo 25: atualização completa com PUT e o cenário de upsert.
11. Referências#
- Microsoft Learn — Excluir dados no EF Core
- Microsoft Learn — Comportamentos de exclusão em cascata
- MDN — 204 No Content