public static async Task InsertAsync(CancellationToken cancellationToken = default(CancellationToken), SqlTransaction transaction = null)
        {
            using (var connection = new SqlConnection())
            {
                connection.Configure();
                await connection.OpenAsync(cancellationToken).ConfigureAwait(true);

                const int recordsToGenerate = 100_000;
                ConsoleLog.Write($"Gerando {recordsToGenerate:n0} registros clientes");
                var customers = Customer.Generate(recordsToGenerate);

                ConsoleLog.Write("Inserindo registros no banco de dados");
                using (var insertBulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
                {
                    using (var customerReader = new ObjectDataReader <Customer>(customers.GetEnumerator()))
                    {
                        insertBulk.Configure("Customer");

                        await insertBulk.WriteToServerAsync(customerReader, cancellationToken).ConfigureAwait(false);
                    }
                }

                using (var command = new SqlCommand("", connection))
                {
                    try
                    {
                        ConsoleLog.Write("Criando tabela temporária e copiando registros");
                        command.CommandText = BulkUpdate.CreateTempTable;
                        command.ExecuteNonQuery();
                        try
                        {
                            ConsoleLog.Write("Atualizando registros: Tabela temporária -> Customers");
                            command.CommandTimeout = 300;
                            command.CommandText    = BulkUpdate.UpdateTable;
                            command.ExecuteNonQuery();
                        }
                        finally
                        {
                            ConsoleLog.Write("Excluindo tabela temporária");
                            command.CommandText = BulkUpdate.DropTempTable;
                            command.ExecuteNonQuery();
                        }
                    }
                    catch (Exception e)
                    {
                        ConsoleLog.Write(e.Message);
                    }
                }
            }
        }