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)); } } } }
public EmailTransferManager( string sourceMongoConnectionStringName, string destinationSqlConnectionStringName, EmailConverter emailConverter, Configuration configuration) { SourceMongoConnectionStringName = sourceMongoConnectionStringName; DestinationSqlConnectionStringName = destinationSqlConnectionStringName; EmailConverter = emailConverter; Configuration = configuration; }
static void Main(string[] args) { var emailAccountProvider = //new LockingEmailAccountProviderDecorator( new CachingEmailAccountProviderDecorator( new EmailAccountProvider("SQLDestination")); //); var emailConverter = new EmailConverter(emailAccountProvider); var emailTransferManager = new EmailTransferManager( "MongoDBSource", "SQLDestination", emailConverter, new Configuration()); emailTransferManager.TransferAll(); }