Пример #1
0
        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);
                }
        }
Пример #2
0
        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));
                    }
                }
            }
        }