private void UpdateMigration(SoftwareMigration softwareMigration, int answerPoolId) { softwareMigration.LastMigrated = new LastMigratedInfo { AnswerPoolId = answerPoolId }.ToJson(); _unitOfWorkFactory.Execute(() => _softwareMigrationRepository.Update(softwareMigration)); }
private SoftwareMigration CreateEmptyMigration() { var softwareMigration = new SoftwareMigration { MigrationName = _migrationName, StartDateUtc = DateTime.UtcNow, MigrationObjects = "PhoneFaxControls", LastMigrated = new LastMigratedInfo().ToJson() }; _unitOfWorkFactory.Execute(() => _softwareMigrationRepository.Insert(softwareMigration)); return(GetMigration()); }
public override void Up() { Run(container => { var mainPhoneDataMigration = new PhoneDataMigration(container); SoftwareMigration softwareMigration = mainPhoneDataMigration.GetMigration() ?? mainPhoneDataMigration.CreateEmptyMigration(); LastMigratedInfo lastMigrated = LastMigratedInfo.FromJson(softwareMigration.LastMigrated); if (softwareMigration.EndDateUtc != null) { Console.WriteLine($"Phones have been converted {softwareMigration.EndDateUtc.Value.ToLocalTime()} "); return; } Guid[] phoneFaxControls = mainPhoneDataMigration.GetPhoneFaxControls(); int[] answerPoolIds = mainPhoneDataMigration._answerRepository.Get(x => x.Id > lastMigrated.AnswerPoolId, x => x.Id, x => x.Id, SortOrder.Ascending); IReadOnlyCollection <int>[] groups = answerPoolIds.Split(GroupSize).ToArray(); int lastMigratedAnswerPoolId = 0; for (int groupIndex = 0; groupIndex < groups.Length; groupIndex++) { var stopWatch = new Stopwatch(); stopWatch.Start(); int[] parallelAnswerPoolIds = groups[groupIndex].ToArray(); Parallel.ForEach(Partitioner.Create(0, parallelAnswerPoolIds.Length), range => { using (ILifetimeScope innerScope = container.BeginLifetimeScope()) { for (int index = range.Item1; index < range.Item2; index++) { int answerPoolId = parallelAnswerPoolIds[index]; new PhoneDataMigration(innerScope).MovePhones(softwareMigration.Id, answerPoolId, phoneFaxControls); } } }); lastMigratedAnswerPoolId = parallelAnswerPoolIds[parallelAnswerPoolIds.Length - 1]; if (groupIndex % LoggingInterval == 0) { mainPhoneDataMigration.UpdateMigration(softwareMigration, lastMigratedAnswerPoolId); } stopWatch.Stop(); Console.WriteLine($"groupIndex={groupIndex}, groups.Length={groups.Length} RunTime {stopWatch.ElapsedMilliseconds}"); } mainPhoneDataMigration.UpdateMigration(softwareMigration, lastMigratedAnswerPoolId); mainPhoneDataMigration.CompleteMigration(softwareMigration); }); }
private void CompleteMigration(SoftwareMigration softwareMigration) { softwareMigration.EndDateUtc = DateTime.UtcNow; _unitOfWorkFactory.Execute(() => _softwareMigrationRepository.Update(softwareMigration)); }