public async Task InsertRecords(int recordCount) { var stopwatch = new Stopwatch(); IEnumerable <IEnumerable <Player> > players = InsertExtensions.GetPlayers(recordCount).Chunk(10000); stopwatch.Start(); List <Task> tasks = new List <Task>(); using (SemaphoreSlim throttler = new SemaphoreSlim(2)) { foreach (var element in players) { await throttler.WaitAsync().ConfigureAwait(false); tasks.Add(Task.Run(async() => { try { await InsertPlayers(element).ConfigureAwait(false); } finally { // ReSharper disable once AccessToDisposedClosure throttler.Release(); } })); } await Task.WhenAll(tasks).ConfigureAwait(false); } stopwatch.Stop(); Console.WriteLine("Inserting {0} players with related skills using Entity Framework took: {1}!", recordCount, stopwatch.Elapsed); }
public async Task InsertRecords(int recordCount) { var stopwatch = new Stopwatch(); IList <Player> players = InsertExtensions.GetPlayers(recordCount); stopwatch.Start(); // Specify fields for Players table var playersDataTable = new DataTable(); playersDataTable.Columns.Add("Id"); playersDataTable.Columns.Add("Name"); playersDataTable.Columns.Add("NickName"); playersDataTable.Columns.Add("Hp"); playersDataTable.Columns.Add("Mp"); playersDataTable.Columns.Add("Attack"); playersDataTable.Columns.Add("Defense"); playersDataTable.Columns.Add("MagicAttack"); playersDataTable.Columns.Add("MagicDefense"); playersDataTable.Columns.Add("Level"); playersDataTable.Columns.Add("CorrelationId"); // Populate players DataTable for (int i = 0; i < players.Count; i++) { playersDataTable.Rows.Add(players[i].Id, players[i].Name, players[i].NickName, players[i].Hp, players[i].Mp, players[i].Attack, players[i].Defense, players[i].MagicAttack, players[i].MagicDefense, players[i].Level, players[i].CorrelationId); } // Write Players to SQL database string connnectionString = new GameContext().Database.GetDbConnection().ConnectionString; using (var sqlBulkCopy = new SqlBulkCopy(connnectionString)) { sqlBulkCopy.DestinationTableName = "Players"; await sqlBulkCopy.WriteToServerAsync(playersDataTable); } // Specify fields for Skills table var skillsDataTable = new DataTable(); skillsDataTable.Columns.Add("Id"); skillsDataTable.Columns.Add("PlayerId"); skillsDataTable.Columns.Add("Name"); skillsDataTable.Columns.Add("Cost"); skillsDataTable.Columns.Add("Cooldown"); skillsDataTable.Columns.Add("Level"); skillsDataTable.Columns.Add("IsLearned"); skillsDataTable.Columns.Add("CorrelationId"); // Populate skills DataTable IList <Skill> skills = players.SelectMany(player => player.Skills).ToList(); for (int i = 0; i < skills.Count; i++) { skillsDataTable.Rows.Add(skills[i].Id, skills[i].CorrelationId, skills[i].Name, skills[i].Cost, skills[i].Cooldown, skills[i].Level, skills[i].IsLearned, skills[i].CorrelationId); } // Write Skills to SQL database using (var sqlBulkCopy = new SqlBulkCopy(connnectionString)) { sqlBulkCopy.DestinationTableName = "Skills"; await sqlBulkCopy.WriteToServerAsync(skillsDataTable); } // Run following Update statement to sync the parent IDs with children string updateMappingSql = "UPDATE Skills SET PlayerId = Players.Id FROM Skills INNER JOIN Players ON Skills.CorrelationId = Players.CorrelationId"; using (SqlConnection connection = new SqlConnection(connnectionString)) using (SqlCommand command = new SqlCommand(updateMappingSql, connection)) { await connection.OpenAsync(); await command.ExecuteNonQueryAsync(); } stopwatch.Stop(); Console.WriteLine("Inserting {0} players and {1} skills with SqlBulkCopy took: {2}!", players.Count, skills.Count, stopwatch.Elapsed); }