public async Task InitializeAsync(CancellationToken cancellationToken) { using (var dbConnection = Connection()) { dbConnection.Open(); // create all tables. all these table files should have existance checks in them var initializationSql = SqlServerUtilities .GetEmbeddedFileNames(SqlInitializationEmbeddedLocation) .OrderBy(fileName => int.Parse(fileName.Replace(SqlInitializationEmbeddedLocation + ".", "") .Replace(".sql", "") .Split('-') .First())) .ToList() .Select(SqlServerUtilities.GetEmbeddedFile).SelectMany( filecontents => Regex.Split(filecontents, @"^GO.*$", RegexOptions.Multiline) .Where(s => !string .IsNullOrWhiteSpace( s)) // we split the file on the GO statements and run each section as its own query ).ToArray(); foreach (var sql in initializationSql) { // execute each update await dbConnection.ExecuteAsync(sql); } } await MigrateAsync(cancellationToken); }
public async Task MigrateAsync(CancellationToken cancellationToken) { using (var dbConnection = Connection()) { dbConnection.Open(); var migrationSqlFilenames = SqlServerUtilities .GetEmbeddedFileNames(SqlMigrationsEmbeddedLocation) .OrderBy(filename => int.Parse(filename.Replace(SqlMigrationsEmbeddedLocation + ".", "") .Replace(".sql", "").Split('-').First())).ToDictionary( key => int.Parse(key.Replace(SqlMigrationsEmbeddedLocation, "").Replace(".sql", "").Split('-') .First()), value => value); var lastMigration = 0; // these should be run in numerical order foreach (var sqlFiles in migrationSqlFilenames) { if (await CheckAsync(cancellationToken) <= sqlFiles.Key) { continue; } var fileContents = SqlServerUtilities.GetEmbeddedFile(sqlFiles.Value); // we split the file on the GO statements and run each section as its own query var sqlQueries = Regex.Split(fileContents, @"^GO.*$", RegexOptions.Multiline) .Where(s => !string.IsNullOrWhiteSpace(s)); foreach (var sql in sqlQueries) { // execute each update await dbConnection.ExecuteAsync(sql); } lastMigration = sqlFiles.Key; } // update to current migration await dbConnection.ExecuteAsync( "UPDATE [Configuration] SET [Value] = @lastMigration WHERE [Id] = 'MigrationVersion'", new { lastMigration }); } }