using DataModel.Database.Common; using DataModel.MigrationScripts; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace DataModel; public static class Setup { private const string ENV_EF_TOOLING_DATABASE = "ENV_EF_TOOLING_DATABASE"; private const string DB_READ_WRITE_MODE = "ReadWrite"; private const string DB_READ_WRITE_CREATE_MODE = "ReadWriteCreate"; private static string usedDataFile = string.Empty; public static string DataFile => Setup.usedDataFile; /// /// Tries to migrate the database. /// public static async Task PerformDataMigration(DataContext dbContext) { var pendingMigrations = (await dbContext.Database.GetPendingMigrationsAsync()).ToList(); foreach (var pendingMigration in pendingMigrations) { Console.WriteLine($"The migration '{pendingMigration}' is pending."); } await dbContext.Database.MigrateAsync(); // // Post migration actions: // if (pendingMigrations.Contains("20221106193544_202211AddUniqueIds")) await Script202211AddUniqueIds.PostMigrationAsync(dbContext); } /// /// Add the database to the DI system /// public static void AddDatabase(this IServiceCollection serviceCollection, string path2DataFile, bool createWhenNecessary = true) { Setup.usedDataFile = path2DataFile; serviceCollection.AddDbContext(options => options.UseSqlite($"Filename={path2DataFile};Mode={(createWhenNecessary ? DB_READ_WRITE_CREATE_MODE : DB_READ_WRITE_MODE)};"), ServiceLifetime.Transient); } /// /// Create the database instance from the given path. /// public static DataContext CreateDatabaseInstance(string path2DataFile, bool createWhenNecessary = true) { // Store the path to the database: Setup.usedDataFile = path2DataFile; // Create a database builder: var builder = new DbContextOptionsBuilder(); // Add the database configuration to the builder: builder.UseSqlite($"Filename={path2DataFile};Mode={(createWhenNecessary ? DB_READ_WRITE_CREATE_MODE : DB_READ_WRITE_MODE)};"); // Next, construct the database context: var dbContext = new DataContext(builder.Options); return dbContext; } /// /// Sets up the DI & db context ready for the EF tooling. /// public static IHostBuilder Setup4EFTooling(string[] args) { var dataFile = Environment.GetEnvironmentVariable(ENV_EF_TOOLING_DATABASE); if (string.IsNullOrWhiteSpace(dataFile)) { Console.WriteLine("In order to use EF tooling, point the environment variable ENV_EF_TOOLING_DATABASE to the data file, which should be used for the EF tooling."); Environment.Exit(100); } var builder = Host.CreateDefaultBuilder(args); builder.ConfigureServices((hostContext, serviceCollection) => { serviceCollection.AddDbContext(options => options.UseSqlite($"Filename={dataFile};Mode=ReadWriteCreate")); }); return builder; } }