private SeedingReport(SeedBucketInfo seedBucketInfo, SeedingPlan?seedingPlan, IReadOnlyCollection <SingleSeedSeedingReport> singleSeedSeedingResults, SeedingStatus status) { System.Diagnostics.Debug.Assert(status != SeedingStatus.SeedBucketHasErrors || (status == SeedingStatus.SeedBucketHasErrors && seedBucketInfo.HasAnyErrors && seedingPlan == null && singleSeedSeedingResults.Count == 0)); System.Diagnostics.Debug.Assert(status != SeedingStatus.BuildingServiceProviderFailed || (status == SeedingStatus.BuildingServiceProviderFailed && !seedBucketInfo.HasAnyErrors && seedingPlan != null && singleSeedSeedingResults.Count == 0)); System.Diagnostics.Debug.Assert(status != SeedingStatus.SeedingSingleSeedFailed || (status == SeedingStatus.SeedingSingleSeedFailed && !seedBucketInfo.HasAnyErrors && seedingPlan != null && singleSeedSeedingResults.Count(result => result.Status == SingleSeedSeedingStatus.Failed) == 1 && singleSeedSeedingResults.Last().Status == SingleSeedSeedingStatus.Failed)); System.Diagnostics.Debug.Assert(status != SeedingStatus.Succeeded || (status == SeedingStatus.Succeeded && !seedBucketInfo.HasAnyErrors && seedingPlan != null && // We can have a situation that there is no seeds to seed. This is fine. singleSeedSeedingResults.All(result => result.Status != SingleSeedSeedingStatus.Failed))); SeedBucketInfo = seedBucketInfo; SeedingPlan = seedingPlan; SingleSeedSeedingResults = singleSeedSeedingResults; Status = status; }
private static async Task SeedDatabaseAsync(IWebHost host) { try { using (var scope = host.Services.CreateScope()) { IServiceProvider services = scope.ServiceProvider; Log.Information("----- Checking seeding status"); var catalogContextSetup = services.GetService <CatalogContextSetup>(); var orderingContextSetup = services.GetService <OrderingContextSetup>(); var catalogSeedingStatus = await catalogContextSetup.GetSeedingStatusAsync(); Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Catalog", catalogSeedingStatus); var orderingSeedingStatus = await orderingContextSetup.GetSeedingStatusAsync(); Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Ordering", orderingSeedingStatus); var seedingStatus = new SeedingStatus(catalogSeedingStatus, orderingSeedingStatus); Log.Information("----- SeedingStatus ({Context}): {@SeedingStatus}", "Aggregated", seedingStatus); if (!seedingStatus.NeedsSeeding) { Log.Information("----- No seeding needed"); return; } Log.Information("----- Seeding database"); var sw = new Stopwatch(); sw.Start(); void ProgressAggregator() { seedingStatus.RecordsLoaded = catalogSeedingStatus.RecordsLoaded + orderingSeedingStatus.RecordsLoaded; Log.Debug("----- Seeding {SeedingPercentComplete}% complete", seedingStatus.PercentComplete); _seedingProgress = seedingStatus.PercentComplete; } var catalogProgressHandler = new Progress <int>(value => { catalogSeedingStatus.RecordsLoaded = value; ProgressAggregator(); }); var orderingProgressHandler = new Progress <int>(value => { orderingSeedingStatus.RecordsLoaded = value; ProgressAggregator(); }); Log.Information("----- Seeding CatalogContext"); Task catalogSeedingTask = Task.Run(async() => await catalogContextSetup.SeedAsync(catalogProgressHandler)); Log.Information("----- Seeding OrderingContext"); Task orderingSeedingTask = Task.Run(async() => await orderingContextSetup.SeedAsync(orderingProgressHandler)); await Task.WhenAll(catalogSeedingTask, orderingSeedingTask); seedingStatus.SetAsComplete(); _seedingProgress = seedingStatus.PercentComplete; Log.Information("----- Database Seeded ({ElapsedTime:n3}s)", sw.Elapsed.TotalSeconds); } } catch (Exception ex) { Log.Error(ex, "----- Exception seeding database"); } }