From e157d2833bdd840d82f6b9eff60a7adc2359d05d Mon Sep 17 00:00:00 2001 From: solidarcsoftware Date: Tue, 30 Jun 2026 18:32:16 +0200 Subject: [PATCH] Seed Restructuring --- .../ProcessEmployeeFinanceDataBenchmark.cs | 55 +++++++------ .../Database/Creator/FinanceDbCreator.cs | 65 +++++++++++++++ .../Database/Creator/HrDbCreator.cs | 65 +++++++++++++++ .../Database/Creator/ItDbCreator.cs | 65 +++++++++++++++ .../Database/Creator/OperationsDbCreator.cs | 65 +++++++++++++++ .../Seeder/HrDbSeeder.cs} | 15 ++-- .../Database/Seeder/IDatabaseSeeder.cs | 8 ++ .../PersistenceRegistration.cs | 22 ++--- .../Seeding/DatabaseCreator.cs | 81 ------------------- .../Services/ISalaryAdjustmentService.cs | 4 +- DataArc.EntityFrameworkCore.Demo/Program.cs | 52 ++++++++---- 11 files changed, 356 insertions(+), 141 deletions(-) create mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/FinanceDbCreator.cs create mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/HrDbCreator.cs create mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/ItDbCreator.cs create mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/OperationsDbCreator.cs rename DataArc.EntityFrameworkCore.Demo.Persistence/{Seeding/DatabaseSeeder.cs => Database/Seeder/HrDbSeeder.cs} (81%) create mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/IDatabaseSeeder.cs delete mode 100644 DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseCreator.cs diff --git a/DataArc.EntityFrameworkCore.Demo.Benchmark/ProcessEmployeeFinanceDataBenchmark.cs b/DataArc.EntityFrameworkCore.Demo.Benchmark/ProcessEmployeeFinanceDataBenchmark.cs index 7537f0d..6cdb3b8 100644 --- a/DataArc.EntityFrameworkCore.Demo.Benchmark/ProcessEmployeeFinanceDataBenchmark.cs +++ b/DataArc.EntityFrameworkCore.Demo.Benchmark/ProcessEmployeeFinanceDataBenchmark.cs @@ -10,6 +10,7 @@ using DataArc.Core; using DataArc.EntityFrameworkCore.Demo.Persistence; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator; using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBModels; using DataArc.EntityFrameworkCore.Demo.Persistence.Utils; @@ -28,16 +29,16 @@ public class RawEmployeeBulkDataBenchmark private const int MaxRecordCount = 1_000_000; private IServiceProvider? _serviceProvider; - private IDatabaseCreator? _databaseCreator; + private IReadOnlyCollection _databaseCreators = []; private ICommandFactory? _commandFactory; private List _allEmployees = []; private List _benchmarkEmployees = []; - [Params(250_000, 500_000, 1_000_000)] + [Params(62_500, 125_000, 250_000)] public int RecordCount { get; set; } - [Params(250_000)] + [Params(62_500)] public int BulkBatchSize { get; set; } [GlobalSetup] @@ -47,7 +48,14 @@ public void GlobalSetup() .AddPersistence() .BuildServiceProvider(); - _databaseCreator = _serviceProvider.GetRequiredService(); + _databaseCreators = + [ + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService() + ]; + _commandFactory = _serviceProvider.GetRequiredService(); _allEmployees = SeedDataGenerator @@ -58,14 +66,22 @@ public void GlobalSetup() [IterationSetup] public void IterationSetup() { - if (_databaseCreator == null) - throw new InvalidOperationException($"{nameof(IDatabaseCreator)} was not resolved."); + if (_databaseCreators.Count == 0) + throw new InvalidOperationException("Benchmark database creators were not resolved."); - if (!_databaseCreator.EnsureDeleted()) - throw new InvalidOperationException("Failed to delete benchmark databases."); + foreach (var databaseCreator in _databaseCreators) + { + if (!databaseCreator.EnsureDeleted()) + throw new InvalidOperationException( + $"Failed to delete benchmark database using {databaseCreator.GetType().Name}."); + } - if (!_databaseCreator.EnsureCreated()) - throw new InvalidOperationException("Failed to create benchmark databases."); + foreach (var databaseCreator in _databaseCreators) + { + if (!databaseCreator.EnsureCreated()) + throw new InvalidOperationException( + $"Failed to create benchmark database using {databaseCreator.GetType().Name}."); + } _benchmarkEmployees = _allEmployees .Take(RecordCount) @@ -117,10 +133,12 @@ public async Task ExecuteParallelBulkInsertAsync() [GlobalCleanup] public void GlobalCleanup() { - //_databaseCreator?.EnsureDeleted(); + // Keep benchmark databases for inspection after the run. } } + #region BenchMarkDotnetSetup + public sealed class BenchmarkConfig : ManualConfig { public BenchmarkConfig() @@ -132,28 +150,18 @@ public BenchmarkConfig() public sealed class TotalInsertedRecordsColumn : IColumn { private readonly int _destinationContextCount; - public TotalInsertedRecordsColumn(int destinationContextCount) { _destinationContextCount = destinationContextCount; } - public string Id => nameof(TotalInsertedRecordsColumn); - public string ColumnName => "Total Inserted Records"; - public bool AlwaysShow => true; - public ColumnCategory Category => ColumnCategory.Params; - public int PriorityInCategory => 0; - public bool IsNumeric => true; - public UnitType UnitType => UnitType.Dimensionless; - public string Legend => "Total records inserted across all participating DbContexts."; - public string GetValue(Summary summary, BenchmarkCase benchmarkCase) { var recordCountParameter = benchmarkCase.Parameters.Items @@ -164,7 +172,6 @@ public string GetValue(Summary summary, BenchmarkCase benchmarkCase) return totalInsertedRecords.ToString("N0"); } - public string GetValue( Summary summary, BenchmarkCase benchmarkCase, @@ -172,15 +179,15 @@ public string GetValue( { return GetValue(summary, benchmarkCase); } - public bool IsAvailable(Summary summary) { return true; } - public bool IsDefault(Summary summary, BenchmarkCase benchmarkCase) { return false; } } + + #endregion } \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/FinanceDbCreator.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/FinanceDbCreator.cs new file mode 100644 index 0000000..b5c103f --- /dev/null +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/FinanceDbCreator.cs @@ -0,0 +1,65 @@ +using DataArc.Core; +using Microsoft.EntityFrameworkCore.Storage; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; + +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator +{ + public interface IFinanceDbCreator : IDatabaseCreator + { + + } + + internal class FinanceDbCreator : IFinanceDbCreator + { + private readonly IDatabaseFactory _databaseFactory; + + public FinanceDbCreator(IDatabaseFactory databaseFactory) + { + _databaseFactory = databaseFactory; + } + + public bool CanConnect() + { + throw new NotImplementedException(); + } + + public Task CanConnectAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureCreated() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteCreate(); + return true; + } + + public Task EnsureCreatedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureDeleted() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteDrop(); + return true; + } + + public Task EnsureDeletedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/HrDbCreator.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/HrDbCreator.cs new file mode 100644 index 0000000..155f112 --- /dev/null +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/HrDbCreator.cs @@ -0,0 +1,65 @@ +using DataArc.Core; +using Microsoft.EntityFrameworkCore.Storage; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; + +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator +{ + public interface IHrDbCreator : IDatabaseCreator + { + + } + + internal class HrDbCreator : IHrDbCreator + { + private readonly IDatabaseFactory _databaseFactory; + + public HrDbCreator(IDatabaseFactory databaseFactory) + { + _databaseFactory = databaseFactory; + } + + public bool CanConnect() + { + throw new NotImplementedException(); + } + + public Task CanConnectAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureCreated() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteCreate(); + return true; + } + + public Task EnsureCreatedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureDeleted() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteDrop(); + return true; + } + + public Task EnsureDeletedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/ItDbCreator.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/ItDbCreator.cs new file mode 100644 index 0000000..4a5b8cf --- /dev/null +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/ItDbCreator.cs @@ -0,0 +1,65 @@ +using DataArc.Core; +using Microsoft.EntityFrameworkCore.Storage; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; + +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator +{ + public interface IItDbCreator : IDatabaseCreator + { + + } + + public class ItDbCreator : IItDbCreator + { + private readonly IDatabaseFactory _databaseFactory; + + public ItDbCreator(IDatabaseFactory databaseFactory) + { + _databaseFactory = databaseFactory; + } + + public bool CanConnect() + { + throw new NotImplementedException(); + } + + public Task CanConnectAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureCreated() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteCreate(); + return true; + } + + public Task EnsureCreatedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureDeleted() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteDrop(); + return true; + } + + public Task EnsureDeletedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/OperationsDbCreator.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/OperationsDbCreator.cs new file mode 100644 index 0000000..da2686d --- /dev/null +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Creator/OperationsDbCreator.cs @@ -0,0 +1,65 @@ +using DataArc.Core; +using Microsoft.EntityFrameworkCore.Storage; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; + +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator +{ + public interface IOperationsDbCreator : IDatabaseCreator + { + + } + + internal class OperationsDbCreator : IOperationsDbCreator + { + private readonly IDatabaseFactory _databaseFactory; + + public OperationsDbCreator(IDatabaseFactory databaseFactory) + { + _databaseFactory = databaseFactory; + } + + public bool CanConnect() + { + throw new NotImplementedException(); + } + + public Task CanConnectAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureCreated() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteCreate(); + return true; + } + + public Task EnsureCreatedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + + public bool EnsureDeleted() + { + var dbBuilder = _databaseFactory.CreateDatabaseBuilder(); + + var db = dbBuilder + .IncludeDbContext() + .Build(generateScripts: true, applyChanges: true); + + db.ExecuteDrop(); + return true; + } + + public Task EnsureDeletedAsync(CancellationToken cancellationToken = default) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseSeeder.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/HrDbSeeder.cs similarity index 81% rename from DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseSeeder.cs rename to DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/HrDbSeeder.cs index cbdd47e..6bbe267 100644 --- a/DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseSeeder.cs +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/HrDbSeeder.cs @@ -2,19 +2,18 @@ using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; using DataArc.EntityFrameworkCore.Demo.Persistence.Utils; -namespace DataArc.EntityFrameworkCore.Demo.Persistence.Seeding +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Seeder { - public interface IDatabaseSeeder + public interface IHrDbSeeder : IDatabaseSeeder { - bool SeedDatabase(int recordCount); - Task SeedDatabaseAsync(int recordCount); + } - public class DatabaseSeeder : IDatabaseSeeder + internal class HrDbSeeder : IHrDbSeeder { private readonly ICommandFactory _commandFactory; - - public DatabaseSeeder(ICommandFactory commandFactory) + + public HrDbSeeder(ICommandFactory commandFactory) { _commandFactory = commandFactory; } @@ -24,6 +23,7 @@ public bool SeedDatabase(int recordCount) try { var seedingCommand = _commandFactory.CreateCommand(); + seedingCommand .UseDbExecutionContext() .AddBulk(SeedDataGenerator.GenerateHrSeedData(recordCount), recordCount) @@ -43,6 +43,7 @@ public async Task SeedDatabaseAsync(int recordCount) { // Build and execute the seeding command var seedingCommand = await _commandFactory.CreateCommandAsync(); + await seedingCommand .UseDbExecutionContext() .AddBulk(SeedDataGenerator.GenerateHrSeedData(recordCount), recordCount) diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/IDatabaseSeeder.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/IDatabaseSeeder.cs new file mode 100644 index 0000000..16b1054 --- /dev/null +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/Database/Seeder/IDatabaseSeeder.cs @@ -0,0 +1,8 @@ +namespace DataArc.EntityFrameworkCore.Demo.Persistence.Database.Seeder +{ + public interface IDatabaseSeeder + { + bool SeedDatabase(int recordCount); + Task SeedDatabaseAsync(int recordCount); + } +} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/PersistenceRegistration.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/PersistenceRegistration.cs index ee62966..ce66ffb 100644 --- a/DataArc.EntityFrameworkCore.Demo.Persistence/PersistenceRegistration.cs +++ b/DataArc.EntityFrameworkCore.Demo.Persistence/PersistenceRegistration.cs @@ -1,14 +1,12 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Storage; +using DataArc.Core; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.Seeder; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Configuration; - -using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; -using DataArc.EntityFrameworkCore.Demo.Persistence.Seeding; - -using DataArc.Core; namespace DataArc.EntityFrameworkCore.Demo.Persistence { @@ -49,8 +47,12 @@ public static IServiceCollection AddPersistence(this IServiceCollection services }); }); - services.TryAddScoped(); - services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + services.TryAddScoped(); + + services.TryAddScoped(); return services; } diff --git a/DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseCreator.cs b/DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseCreator.cs deleted file mode 100644 index f1a9022..0000000 --- a/DataArc.EntityFrameworkCore.Demo.Persistence/Seeding/DatabaseCreator.cs +++ /dev/null @@ -1,81 +0,0 @@ -using DataArc.Core; -using DataArc.EntityFrameworkCore.Demo.Persistence.Database.DBContexts; -using Microsoft.EntityFrameworkCore.Storage; - -namespace DataArc.EntityFrameworkCore.Demo.Persistence.Seeding -{ - public class DatabaseCreator : IDatabaseCreator //EFCore provides the IDatabaseCreator interface to manage database creation and deletion. By implementing this interface, we can control how our databases are created, ensuring that they are set up according to our specific requirements. - { - private readonly IDatabaseFactory _databaseFactory; - public DatabaseCreator(IDatabaseFactory databaseFactory) - { - _databaseFactory = databaseFactory; - } - - public bool CanConnect() - { - throw new NotImplementedException(); - } - - public Task CanConnectAsync(CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - - public bool EnsureCreated() - { - try - { - //Synchronize the database schemas with the current model definitions. This ensures that any changes made to the model classes are reflected in the database structure. - var databaseBuilder = _databaseFactory.CreateDatabaseBuilder(); - var db = databaseBuilder - .IncludeDbContext() - .IncludeDbContext() - .IncludeDbContext() - .IncludeDbContext() - .Build(applyChanges:true); - - // Drop and create databases - db.ExecuteCreate(); - - return true; - } - catch - { - throw; - } - } - - public Task EnsureCreatedAsync(CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - - public bool EnsureDeleted() - { - try - { - // Drop the databases if they exist. This is useful for resetting the state of the databases during development or testing. - var databaseBuilder = _databaseFactory.CreateDatabaseBuilder(); - var db = databaseBuilder - .IncludeDbContext() - .IncludeDbContext() - .IncludeDbContext() - .IncludeDbContext() - .Build(applyChanges: true, generateScripts: true); - - db.ExecuteDrop(); - return true; - } - catch - { - throw; - } - } - - public Task EnsureDeletedAsync(CancellationToken cancellationToken = default) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/DataArc.EntityFrameworkCore.Demo/Application/Modules/Finance/Features/SalaryAdjustments/Services/ISalaryAdjustmentService.cs b/DataArc.EntityFrameworkCore.Demo/Application/Modules/Finance/Features/SalaryAdjustments/Services/ISalaryAdjustmentService.cs index 1702bf6..b5b1ae5 100644 --- a/DataArc.EntityFrameworkCore.Demo/Application/Modules/Finance/Features/SalaryAdjustments/Services/ISalaryAdjustmentService.cs +++ b/DataArc.EntityFrameworkCore.Demo/Application/Modules/Finance/Features/SalaryAdjustments/Services/ISalaryAdjustmentService.cs @@ -1,6 +1,4 @@ -using DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Features.SalaryAdjustments.Dtos; - -namespace DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Features.SalaryAdjustments.Services +namespace DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Features.SalaryAdjustments.Services { public interface ISalaryAdjustmentService { diff --git a/DataArc.EntityFrameworkCore.Demo/Program.cs b/DataArc.EntityFrameworkCore.Demo/Program.cs index 2bd7c1e..82ab01c 100644 --- a/DataArc.EntityFrameworkCore.Demo/Program.cs +++ b/DataArc.EntityFrameworkCore.Demo/Program.cs @@ -1,23 +1,34 @@ -using DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Features.SalaryAdjustments.Services; -using DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Registration; -using DataArc.EntityFrameworkCore.Demo.Persistence.Seeding; - -using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.DependencyInjection; +using DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Features.SalaryAdjustments.Services; +using DataArc.EntityFrameworkCore.Demo.Application.Modules.Finance.Registration; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.Creator; +using DataArc.EntityFrameworkCore.Demo.Persistence.Database.Seeder; + const int batchSize = 100_000; var serviceProvider = new ServiceCollection() .AddFinanceModule() .BuildServiceProvider(); -var databaseCreator = serviceProvider.GetRequiredService(); -var databaseSeeder = serviceProvider.GetRequiredService(); +var databaseCreators = new IDatabaseCreator[] +{ + serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService() +}; +var databaseSeeders = new IDatabaseSeeder[] +{ + serviceProvider.GetRequiredService(), +}; + var salaryAdjustmentService = serviceProvider.GetRequiredService(); var employeePerformanceService = serviceProvider.GetRequiredService(); -await ResetDatabasesAsync(databaseCreator, databaseSeeder, batchSize); +await ResetDatabasesAsync(databaseCreators, databaseSeeders, batchSize); decimal salaryAdjustmentBaseRate = 0.05m; decimal salaryThreshold = 10_000m; @@ -54,22 +65,31 @@ Console.ReadKey(); static async Task ResetDatabasesAsync( - IDatabaseCreator databaseCreator, - IDatabaseSeeder databaseSeeder, + IReadOnlyCollection databaseCreators, + IReadOnlyCollection databaseSeeders, int batchSize) { - if (!databaseCreator.EnsureDeleted()) - throw new InvalidOperationException("Failed to delete the demo databases."); + foreach (var databaseCreator in databaseCreators) + { + if (!databaseCreator.EnsureDeleted()) + throw new InvalidOperationException($"Failed to delete database using {databaseCreator.GetType().Name}."); + } Console.WriteLine("Databases deleted successfully."); - if (!databaseCreator.EnsureCreated()) - throw new InvalidOperationException("Failed to create the demo databases."); + foreach (var databaseCreator in databaseCreators) + { + if (!databaseCreator.EnsureCreated()) + throw new InvalidOperationException($"Failed to create database using {databaseCreator.GetType().Name}."); + } Console.WriteLine("Databases created successfully."); - if (!await databaseSeeder.SeedDatabaseAsync(batchSize)) - throw new InvalidOperationException("Failed to seed the demo databases."); + foreach (var databaseSeeder in databaseSeeders) + { + if(!await databaseSeeder.SeedDatabaseAsync(batchSize)) + throw new InvalidOperationException("Failed to seed the demo databases."); + } Console.WriteLine("Databases seeded successfully."); } \ No newline at end of file