using SharedLibrary.Database.Models; using SharedLibrary.Objects; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SharedLibrary.Database { //https://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework public static class Importer { public static void ImportClients(IList clients) { DatabaseContext context = null; try { context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in clients) { ++count; var link = new EFAliasLink() { Active = true }; var alias = new EFAlias() { Active = true, DateAdded = entityToInsert.LastConnection, IPAddress = entityToInsert.IPAddress, Link = link, Name = entityToInsert.Name, }; var client = new EFClient() { Active = true, AliasLink = link, Connections = entityToInsert.Connections, CurrentAlias = alias, FirstConnection = entityToInsert.LastConnection, Level = entityToInsert.Level, LastConnection = entityToInsert.LastConnection, TotalConnectionTime = entityToInsert.TotalConnectionTime, Masked = entityToInsert.Masked, NetworkId = entityToInsert.NetworkId }; context = AddClient(context, client, count, 100, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } } private static DatabaseContext AddClient(DatabaseContext context, EFClient client, int count, int commitCount, bool recreateContext) { context.Clients.Add(client); if (count % commitCount == 0) { try { context.SaveChanges(); } catch (Exception e) { var a = 1; } if (recreateContext) { context.Dispose(); context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; } public static void ImportPenalties(IList penalties) { DatabaseContext context = null; try { context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in penalties) { ++count; var punisher = entityToInsert.Offender.NetworkId == entityToInsert.Punisher.NetworkId ? context.Clients.SingleOrDefault(c => c.ClientId == 1) : context.Clients.SingleOrDefault(c => c.NetworkId == entityToInsert.Punisher.NetworkId); if (punisher == null) continue; var offender = context.Clients.Include("AliasLink").SingleOrDefault(c => c.NetworkId == entityToInsert.Offender.NetworkId); if (offender == null) continue; var penalty = new EFPenalty() { Active = true, Expires = entityToInsert.Expires.Year == 9999 ? DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()) : entityToInsert.Expires, Offender = offender, Punisher = punisher, Offense = entityToInsert.Offense, Type = entityToInsert.Type, When = entityToInsert.When == DateTime.MinValue ? DateTime.UtcNow : entityToInsert.When, Link = offender.AliasLink }; context = AddPenalty(context, penalty, count, 100, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } } private static DatabaseContext AddPenalty(DatabaseContext context, EFPenalty penalty, int count, int commitCount, bool recreateContext) { context.Penalties.Add(penalty); if (count % commitCount == 0) { try { context.SaveChanges(); } catch (Exception e) { var a = 1; } if (recreateContext) { context.Dispose(); context = new DatabaseContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; } } }