Estou usando o seguinte código em um dos meus projetos:
using (var _context = new DBContext(new DbContextOptions<DBContext>()))
{
try
{
_context.MyItems.Remove(new MyItem() { MyItemId = id });
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
if (!_context.MyItems.Any(i => i.MyItemId == id))
{
return NotFound();
}
else
{
throw ex;
}
}
}
Dessa forma, ele consultará o banco de dados duas vezes apenas se ocorrer uma exceção ao tentar remover o item com o ID especificado. Então, se o item não for encontrado, ele retornará uma mensagem significativa; caso contrário, ele apenas devolve a exceção (você pode lidar com isso de uma maneira mais adequada ao seu caso usando diferentes blocos catch para diferentes tipos de exceção, adicionar mais verificações personalizadas usando blocos if etc.).
[Estou usando este código em um projeto MVC .Net Core / .Net Core com Entity Framework Core.]