private EmailAccount GetOrCreateEmailAccount(string emailAddress) { using (var enronSqlContext = new EnronSqlContext(DestinationConnectionStringName)) using (var transaction = enronSqlContext.Database.BeginTransaction(IsolationLevel.Serializable)) { var existingEmailAccount = enronSqlContext.EmailAccount.SingleOrDefault(_ => _.EmailAddress == emailAddress); if (existingEmailAccount != null) { return(existingEmailAccount); } var newEmailAccount = new EmailAccount() { EmailAddress = emailAddress }; enronSqlContext.EmailAccount.Add(newEmailAccount); enronSqlContext.SaveChanges(); transaction.Commit(); return(newEmailAccount); } }
public void TransferAll() { var stopwatch = Stopwatch.StartNew(); var cursor = 0; var sourceCollection = OpenSourceCollection(); while (true) { using (var destinationContext = new EnronSqlContext(DestinationSqlConnectionStringName)) //using (var transactionScope = new TransactionScope()) { destinationContext.Configuration.AutoDetectChangesEnabled = false; try { var batch = sourceCollection.Skip(cursor).Limit(Configuration.BatchSize).ToEnumerable(); if (!batch.Any()) { break; } var convertedMails = batch //.AsParallel() .Select(originalEmail => EmailConverter.ConvertEmail(originalEmail)) .ToArray(); destinationContext.Mail.AddRange(convertedMails); //destinationContext.BulkInsert(convertedMails); destinationContext.SaveChanges(); //transactionScope.Complete(); //var senders = convertedMails.Select(_ => _.Sender); //var recipients = convertedMails.SelectMany(_ => _.Recipients); //var headers = convertedMails.SelectMany(_ => _.Headers); //destinationContext.Sender.AddRange(senders); //destinationContext.Recipient.AddRange(recipients); //destinationContext.Header.AddRange(headers); //destinationContext.SaveChanges(); cursor += Configuration.BatchSize; Console.WriteLine( "Converted {0} messages ({1} per minute)", cursor, cursor / stopwatch.Elapsed.TotalMilliseconds * 1000 * 60); } catch (Exception e) { Console.WriteLine("Exception occurred (retrying in 10s):" + e.ToString()); Thread.Sleep(TimeSpan.FromSeconds(10)); } } } }