/// <summary> /// Получить список столбцов которые будут удалены /// </summary> /// <param name="configuration">Конфигурация миграций</param> /// <returns>Список столбцов которые будут удалены</returns> private IEnumerable <ColumnInfo> GetDroppingColumnFromMigrationsConfiguration(DbMigrationsConfiguration configuration) { var droppingColumn = new List <ColumnInfo>(); if (configuration != null) { var migrator = new DbMigrator(configuration); var pendingMigrations = migrator.GetPendingMigrations(); if (pendingMigrations.Any()) { var targetMigration = pendingMigrations.Last(); var scriptor = new MigratorScriptingDecorator(migrator); string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: targetMigration); var parts = script.Split(new[] { "\r\n\r\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList(); //разбиваем скрипт по миграциям parts.RemoveAll(p => p.StartsWith("INSERT [dbo].[__MigrationHistory]") || p.StartsWith("VALUES")); //удаляем вставки в MigrationHistory var dropColumnParts = parts.Where(p => p.Contains("DROP COLUMN")); //находим DROP COLUMN foreach (var dropColumnPart in dropColumnParts) { Regex regex = new Regex("ALTER TABLE (?<schemaWithTable>.*) DROP COLUMN (?<column>.*)"); Match match = regex.Match(dropColumnPart); string[] schemaWithTable = match.Groups["schemaWithTable"].Value.Split(new[] { '.', '[', ']' }, StringSplitOptions.RemoveEmptyEntries); string schema = schemaWithTable.First(); string table = schemaWithTable.Last(); string column = match.Groups["column"].Value.Trim(new[] { '[', ']' }); droppingColumn.Add(new ColumnInfo(new TableInfo(schema, table), column)); } } } return(droppingColumn); }
protected string GetIdempotentMigrationSql(DbMigrationsConfiguration migrationConfiguration) { MigratorScriptingDecorator loggingScripter = new MigratorScriptingDecorator(CreateLoggingMigrator(migrationConfiguration)); string sql = loggingScripter.ScriptUpdate(DbMigrator.InitialDatabase, null); return(sql); }
public void Can_script_middle_migration_with_leading_automatic_migration(bool whenDatabaseExists) { ResetDatabase(); var migrator1 = CreateMigrator <ShopContext_v1>(); var version1 = new MigrationScaffolder(migrator1.Configuration).Scaffold("Version1"); CreateMigrator <ShopContext_v1>(scaffoldedMigrations: version1).Update(); CreateMigrator <ShopContext_v2>(automaticDataLossEnabled: true, scaffoldedMigrations: version1).Update(); var migrator2 = CreateMigrator <ShopContext_v3>(scaffoldedMigrations: version1); var version3 = new MigrationScaffolder(migrator2.Configuration).Scaffold("Version3"); var migrator3 = CreateMigrator <ShopContext_v3>( automaticDataLossEnabled: true, scaffoldedMigrations: new[] { version1, version3 }); migrator3.Update(); var scriptingDecorator = new MigratorScriptingDecorator(migrator3); if (!whenDatabaseExists) { ResetDatabase(); } // Act var script = scriptingDecorator.ScriptUpdate(version1.MigrationId, version3.MigrationId); // Assert Assert.False(script.Contains(CreateMetadataStatement)); Assert.False(script.Contains("Version1")); Assert.True(script.Contains("AutomaticMigration")); Assert.True(script.Contains("Version3")); }
public static void Initialize <TDbContext>(Func <TDbContext> contextFactory, DbMigrationsConfiguration <TDbContext> contextConfiguration) where TDbContext : DbContext { Factory = contextFactory; Configuration = contextConfiguration; var tableTypes = typeof(TDbContext).GetProperties().Where(x => x.PropertyType.FullName.Contains("System.Data.Entity.DbSet")).Select(x => x.PropertyType.GenericTypeArguments.First()).ToList(); var migrator = new DbMigrator(Configuration); var scriptor = new MigratorScriptingDecorator(migrator); var migrationScript = scriptor.ScriptUpdate("0", null); using (var context = contextFactory()) { var baseScripts = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript(); Scripts = tableTypes.ToDictionary(x => x, x => { var tableName = GetFullTableNameAndSchema(x, context); return(new FenixScript { TableScript = ExtractTableScript(tableName, baseScripts), FkScripts = ExtractFkScripts(tableName, baseScripts), IndexScripts = ExtractIndexScripts(tableName, migrationScript) }); }); } }
private string GetScriptFromMigrations() { var type = typeof(T); var fenixAttr = type.CustomAttributes.Where(x => x.AttributeType == typeof(FenixAttribute)).FirstOrDefault(); if (fenixAttr != null) { var migrations = (fenixAttr.ConstructorArguments.First().Value as ReadOnlyCollection <CustomAttributeTypedArgument>).Select(x => x.Value.ToString()).ToArray(); var migrator = new DbMigrator(Configuration); var allMigrations = migrator.GetLocalMigrations().ToList(); var scriptor = new MigratorScriptingDecorator(migrator); string allMigrationScripts = null; foreach (var migration in migrations) { var target = allMigrations.Where(x => x.Contains(migration)).First(); var targetIndex = allMigrations.IndexOf(target); var source = targetIndex == 0 ? "0" : Regex.Match(allMigrations.Where(x => allMigrations.IndexOf(x) == (targetIndex - 1)).First(), @"(?<=\d+_).+").Value; string script = scriptor.ScriptUpdate(source, target); allMigrationScripts += $"{ExtractScriptFromMigration(script, source)}{"\r\n"}"; } return(allMigrationScripts.Trim()); } return(null); }
protected override void ProcessRecord() { base.ProcessRecord(); var migrator = GetMigrator(); var migrationBundles = migrator.GetMigrationPlan(); if (!migrationBundles.Any()) { WriteWarning("No pending migration."); return; } var bundleNumber = 1; foreach (var migrationBundle in migrationBundles) { WriteObject(string.Format("\n-- Part {0}: {1}\n--\tContains:", bundleNumber++, migrationBundle)); foreach (var applyingMigration in migrationBundle.MigrationNames) { WriteObject(string.Format("--\t\t-{0}", applyingMigration)); } var scriptor = new MigratorScriptingDecorator(migrationBundle.GetNewMigrator()); var script = scriptor.ScriptUpdate(migrationBundle.SourceMigrationName, migrationBundle.TargetMigrationName); WriteObject(script); } }
protected string GetMigrationSql(DbMigrationsConfiguration migrationConfiguration, string migrationName) { MigratorScriptingDecorator loggingScripter = new MigratorScriptingDecorator(CreateLoggingMigrator(migrationConfiguration)); string sql = loggingScripter.ScriptUpdate(null, migrationName); return(sql); }
protected string GetRollbackAllSql(DbMigrationsConfiguration migrationConfiguration) { MigratorScriptingDecorator loggingScripter = new MigratorScriptingDecorator(CreateLoggingMigrator(migrationConfiguration)); string sql = loggingScripter.ScriptUpdate(null, DbMigrator.InitialDatabase); return(sql); }
private void Can_script_first_migration_with_leading_automatic_migration(bool whenDatabaseExists) { ResetDatabase(); CreateMigrator <ShopContext_v2>().Update(); var migrator1 = CreateMigrator <ShopContext_v3>(); var version2 = new MigrationScaffolder(migrator1.Configuration).Scaffold("Version2"); var migrator2 = CreateMigrator <ShopContext_v3>(scaffoldedMigrations: version2); migrator2.Update(); if (!whenDatabaseExists) { ResetDatabase(); } var scriptingDecorator = new MigratorScriptingDecorator(CreateMigrator <ShopContext_v3>(scaffoldedMigrations: version2)); // Act var script = scriptingDecorator.ScriptUpdate(DbMigrator.InitialDatabase, version2.MigrationId); // Assert Assert.True(script.Contains(CreateMetadataStatement)); Assert.True(script.Contains("AutomaticMigration")); Assert.True(script.Contains("Version2")); }
public void CanScriptMigration() { var migrator = new MigratorScriptingDecorator(new DbMigrator(new AutoConfiguration())); string sql = migrator.ScriptUpdate("201501032325042_Merge BaseModel3", "201501110901388_Add CustomUserRole"); Console.Out.WriteLine(sql); }
private void ExecuteDatabaseMigration(Func <DbMigrator> getMigrator, SqlConnection sqlConnection, string accessToken) { var migrator = getMigrator(); var migratorForScripting = getMigrator(); OverwriteSqlConnection(migrator, sqlConnection, accessToken); OverwriteSqlConnection(migratorForScripting, sqlConnection, accessToken); var sqlConnectionDataSource = sqlConnection.DataSource; var sqlConnectionDatabase = sqlConnection.Database; Logger.LogInformation("Target database is: {DataSource}/{Database}.", sqlConnectionDataSource, sqlConnectionDatabase); var pendingMigrations = migrator.GetPendingMigrations(); if (pendingMigrations.Count() > 0) { var databaseMigrations = migrator.GetDatabaseMigrations().ToList(); databaseMigrations.Reverse(); var localMigrations = migrator.GetLocalMigrations().ToList(); try { CheckIsValidMigration(databaseMigrations, localMigrations); } catch (Exception e) { Logger.LogError(0, e, "Validation check of migration context failed."); throw; } Logger.LogInformation("Validation check of migration context finished successfully."); Logger.LogInformation("Applying pending migrations: \n {PendingMigrations}.", String.Join("\n", pendingMigrations)); var migratorScripter = new MigratorScriptingDecorator(migratorForScripting); var migrationScripts = migratorScripter.ScriptUpdate(sourceMigration: null, targetMigration: null); Logger.LogInformation("Applying explicit migration SQL scripts: \n {migrationScripts}.", migrationScripts); try { Logger.LogInformation("Executing migrations..."); migrator.Update(); Logger.LogInformation("Finished executing {pendingMigrationsCount} migrations successfully on the target database {DataSource}/{Database}.", pendingMigrations.Count(), sqlConnectionDataSource, sqlConnectionDatabase); } catch (Exception e) { Logger.LogError(0, e, "Failed to execute migrations on the target database {DataSource}/{Database}.", sqlConnectionDataSource, sqlConnectionDatabase); throw; } } else { Logger.LogInformation("There are no pending migrations to execute."); } }
private void Can_script_trailing_automatic_migration(bool whenDatabaseExists) { ResetDatabase(); var migrator1 = CreateMigrator <ShopContext_v1>(); var version1 = new MigrationScaffolder(migrator1.Configuration).Scaffold("Version1"); var migrator2 = CreateMigrator <ShopContext_v2>(automaticDataLossEnabled: true, scaffoldedMigrations: version1); migrator2.Update(); var scriptingDecorator = new MigratorScriptingDecorator(migrator2); if (!whenDatabaseExists) { ResetDatabase(); } // Act var script = scriptingDecorator.ScriptUpdate(version1.MigrationId, null); // Assert Assert.False(script.Contains(CreateMetadataStatement)); Assert.False(script.Contains("Version1")); Assert.True(script.Contains("AutomaticMigration")); }
/// <summary> /// Automatic Migration at runtime /// </summary> public static void ApplyDatabaseMigrations() { //Configuration is the class created by Enable-Migrations DbMigrationsConfiguration dbMgConfig = new Configuration() { ContextType = typeof(DBContext) }; using (var databaseContext = new DBContext()) { try { var database = databaseContext.Database; var migrationConfiguration = dbMgConfig; migrationConfiguration.TargetDatabase = new DbConnectionInfo(database.Connection.ConnectionString, "System.Data.SqlClient"); var migrator = new DbMigrator(migrationConfiguration); migrator.Update(); } catch (AutomaticDataLossException adle) { dbMgConfig.AutomaticMigrationDataLossAllowed = true; var mg = new DbMigrator(dbMgConfig); var scriptor = new MigratorScriptingDecorator(mg); string script = scriptor.ScriptUpdate(null, null); throw new Exception(adle.Message + " : " + script); } } }
private void Can_script_using_migration_names(bool whenDatabaseExists) { ResetDatabase(); var migrator = CreateMigrator <ShopContext_v1>(); var version1 = new MigrationScaffolder(migrator.Configuration).Scaffold("Banana"); CreateMigrator <ShopContext_v1>(scaffoldedMigrations: version1).Update(); migrator = CreateMigrator <ShopContext_v2>(scaffoldedMigrations: version1); var version2 = new MigrationScaffolder(migrator.Configuration).Scaffold("Apple"); migrator = CreateMigrator <ShopContext_v2>(scaffoldedMigrations: new[] { version1, version2 }); migrator.Update(); if (!whenDatabaseExists) { ResetDatabase(); } var scriptingDecorator = new MigratorScriptingDecorator( CreateMigrator <ShopContext_v2>(scaffoldedMigrations: new[] { version1, version2 })); var script = scriptingDecorator.ScriptUpdate("Banana", "Apple"); Assert.False(script.Contains(CreateMetadataStatement)); Assert.False(script.Contains("Banana")); Assert.True(script.Contains("Apple")); Assert.False(script.Contains("AutomaticMigration")); }
/// <summary> /// Creates SQL script from migration. /// The script is usually used in production database because you will not be executing migrations with visual studio in your production database. /// </summary> /// <returns></returns> public static string CreateScriptFromMigration() { var migrationConfig = new StudentInfoMigrationsConfiguration(); var migrator = new DbMigrator(migrationConfig); var scriptor = new MigratorScriptingDecorator(migrator); return(scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null)); }
static void Main(string[] args) { var scriptor = new MigratorScriptingDecorator(new DbMigrator(new Configuration())); var script = scriptor.ScriptUpdate(null, null); Console.WriteLine(script); Console.ReadLine(); }
public void ScriptMigration(string from, string to, string output) { var config = FindDbMigrationsConfiguration(); var migrator = new DbMigrator(config); var scriptingDecorator = new MigratorScriptingDecorator(migrator); var script = scriptingDecorator.ScriptUpdate(from ?? "0", to); File.WriteAllText(output, script); Console.WriteLine($"Scripted migration as SQL to file '{output}'."); }
private void TestSqlGeneration <T>(DbMigrationsConfiguration <T> configuration) where T : DbContext { var migrator = new DbMigrator(configuration); var scriptingMigrator = new MigratorScriptingDecorator(migrator); var migrations = migrator.GetLocalMigrations().OrderBy(c => c).ToList(); // NOTE: go from first to annotateTable var str = scriptingMigrator.ScriptUpdate(migrations.First(c => c.Contains("first")), migrations.First(c => c.Contains("annotate"))); }
public void CanScriptMigrationFromBaseData() { // note: notice that there is a bug in the ef that causes schema name for insert into MigrationsHistory table to be incorrect // (bug reported here: https://entityframework.codeplex.com/workitem/1871) var migrator = new MigratorScriptingDecorator(new DbMigrator(new Configuration())); string sql = migrator.ScriptUpdate("201501032315036_Introduce by-directional association", "201501032326177_Rename LookupItem pk"); Console.Out.WriteLine(sql); }
/* * public static string GetAllMigration() * { * * * var config = new DbMigrationsConfiguration<SampleDBContext> { AutomaticMigrationsEnabled = true }; * * var migrator = new DbMigrator(config); * * //Get code migration// * var scaffolder = new MigrationScaffolder(migrator.Configuration); * * ScaffoldedMigration migration = scaffolder.Scaffold("codeMigration"); * * var migrationFile = System.IO.Path.Combine(rootPath, migration.Directory, migration.MigrationId); * * var userCodeFile = migrationFile + ".cs"; * * File.WriteAllText(userCodeFile, migration.UserCode); * * //Get Db script// * var scriptor = new MigratorScriptingDecorator(migrator); * * string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); * * var SqlScriptFile = migrationFile + ".sql"; * * File.WriteAllText(SqlScriptFile, script); * * //Get Edmx Document// * * var _currenModelProp = migrator.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Single(m => m.Name == "_currentModel"); * * var _currenModelValueXDOC = (XDocument)_currenModelProp.GetValue(migrator); * * var edmxFile = migrationFile + ".xml"; * * * File.WriteAllText(edmxFile, _currenModelValueXDOC.ToString()); * * return script; * } */ static void gettypfromassebmly() { var assemblyPath = @"C:\Users\rajneesh.kumar\source\repos\EF6-Code-First-Demo-master\EF6CodeFirstDemo\bin\Debug"; var assemblyName = string.Format(@"{0}\{1}.{2}", assemblyPath, "EF6ClassLibraryCodeFirst", "dll"); var assembly = Assembly.LoadFrom(assemblyName); var type = assembly.GetType("EF6ClassLibraryCodeFirst.SampleDBContext"); Type genericClass = typeof(DbMigrationsConfiguration <>); //MakeGenericType is badly named Type constructedClass = genericClass.MakeGenericType(type); object created = Activator.CreateInstance(constructedClass); //////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// var config = (DbMigrationsConfiguration)created; config.AutomaticMigrationsEnabled = true; var migrator = new DbMigrator(config); //Get code migration// var scaffolder = new MigrationScaffolder(migrator.Configuration); ScaffoldedMigration migration = scaffolder.Scaffold("codeMigration"); var migrationFile = System.IO.Path.Combine(rootPath, migration.Directory, migration.MigrationId); var userCodeFile = migrationFile + ".cs"; File.WriteAllText(userCodeFile, migration.UserCode); //Get Db script// var scriptor = new MigratorScriptingDecorator(migrator); string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); var SqlScriptFile = migrationFile + ".sql"; File.WriteAllText(SqlScriptFile, script); //Get Edmx Document// var _currenModelProp = migrator.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Single(m => m.Name == "_currentModel"); var _currenModelValueXDOC = (XDocument)_currenModelProp.GetValue(migrator); var edmxFile = migrationFile + ".xml"; File.WriteAllText(edmxFile, _currenModelValueXDOC.ToString()); }
public override void Run() { var migrator = GetMigrator(); var script = new MigratorScriptingDecorator(migrator) .ScriptUpdate(SourceMigration, TargetMigration); AppDomain.CurrentDomain.SetData("result", script); }
public static MigratorScriptingDecorator CreateDbMigrationScriptingDecorator(string connectionString, string dllPath, string configurationClassName) { var migrator = CreateDbMigration(connectionString, dllPath, configurationClassName); if (migrator != null) { var scriptor = new MigratorScriptingDecorator(migrator); return(scriptor); } return(null); }
private static void SaveToFile(string SQLScriptPath, DbMigrator dbMigrator) { if (string.IsNullOrWhiteSpace(SQLScriptPath)) { return; } var scriptor = new MigratorScriptingDecorator(dbMigrator); var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); File.WriteAllText(SQLScriptPath, script); Console.WriteLine(script); }
private void Can_script_windows(bool whenDatabaseExists) { ResetDatabase(); var migrator1 = CreateMigrator <ShopContext_v1>(); var version1 = new MigrationScaffolder(migrator1.Configuration).Scaffold("Version1"); CreateMigrator <ShopContext_v1>(scaffoldedMigrations: version1).Update(); var migrator2 = CreateMigrator <ShopContext_v2>(scaffoldedMigrations: version1); var version2 = new MigrationScaffolder(migrator2.Configuration).Scaffold("Version2"); CreateMigrator <ShopContext_v2>(scaffoldedMigrations: new[] { version1, version2 }).Update(); var migrator3 = CreateMigrator <ShopContext_v3>(scaffoldedMigrations: new[] { version1, version2 }); var version3 = new MigrationScaffolder(migrator3.Configuration).Scaffold("Version3"); var migrator4 = CreateMigrator <ShopContext_v3>(scaffoldedMigrations: new[] { version1, version2, version3 }); var scriptingDecorator = new MigratorScriptingDecorator(migrator4); if (!whenDatabaseExists) { ResetDatabase(); } // All var script = scriptingDecorator.ScriptUpdate(DbMigrator.InitialDatabase, null); Assert.True(script.Contains(CreateMetadataStatement)); Assert.True(script.Contains("Version1")); Assert.True(script.Contains("Version2")); Assert.True(script.Contains("Version3")); Assert.False(script.Contains("AutomaticMigration")); // 1 script = scriptingDecorator.ScriptUpdate(DbMigrator.InitialDatabase, version1.MigrationId); Assert.True(script.Contains(CreateMetadataStatement)); Assert.True(script.Contains("Version1")); Assert.False(script.Contains("Version2")); Assert.False(script.Contains("Version3")); Assert.False(script.Contains("AutomaticMigration")); // 1 & 2 script = scriptingDecorator.ScriptUpdate(DbMigrator.InitialDatabase, version2.MigrationId); Assert.True(script.Contains(CreateMetadataStatement)); Assert.True(script.Contains("Version1")); Assert.True(script.Contains("Version2")); Assert.False(script.Contains("Version3")); Assert.False(script.Contains("AutomaticMigration")); }
public static void GenerateSQLScript() { #if DEBUG var migrator = new DbMigrator(new Configuration()); var scriptor = new MigratorScriptingDecorator(migrator); var migration = migrator.GetLocalMigrations().LastOrDefault(); var sql = scriptor.ScriptUpdate("0", migration); string info = $"-- ========================================== --\r\n-- Current Migration: {migration}\r\n-- ========================================== --\r\n\r\n"; const string fileName = "OpenNos.sql"; File.WriteAllText(Path.Combine(@"../../../OpenNos.DAL.EF/DB/", fileName), info + sql); #endif }
private void btnScript_Click(object sender, EventArgs e) { using (var db = new EFCodeFirstContext()) { if (!db.Database.CompatibleWithModel(true)) { var migrator = new DbMigrator(new EFCodeFirst.Data.Migrations.Configuration()); var script = new MigratorScriptingDecorator(migrator); rtbScript.Text = script.ScriptUpdate(sourceMigration: null, targetMigration: null); } } }
public static DelegatedMigrator CreateFromMigrationConfig(DbMigrationsConfiguration c, DbConnection cnn) { var impl = new DbMigrator(c); var scriptingImpl = new MigratorScriptingDecorator(new DbMigrator(c)); var migrator = new DelegatedMigrator(impl.GetPendingMigrations, impl.GetDatabaseMigrations, impl.Update, scriptingImpl.ScriptUpdate, cnn) { IsAutoMigrationsEnabled = c.AutomaticMigrationsEnabled, ConfigurationTypeName = c.GetType().FullName }; return(migrator); }
static void Main(string[] args) { // You can test the solution by running this console application as well // This will print the migration script just as if it were generated by Update-Database -Script var configuration = new Configuration(); var migrator = new DbMigrator(configuration); var scriptor = new MigratorScriptingDecorator(migrator); string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); Console.WriteLine(script); Console.ReadLine(); }
/// <inheritdoc /> public override string BuildDatabaseInitializationScript() { if (this.TransactionContext == null) { return((string)null); } IEnumerable <MigrationStatement> migrationStatements = TransactionContextInitializer <TransactionContext> .GenerateMigrationStatements(this.TransactionContext); StringBuilder sqlBuilder = new StringBuilder(); MigratorScriptingDecorator.BuildSqlScript(migrationStatements, sqlBuilder); return(sqlBuilder.ToString()); }
/// <inheritdoc/> public override string BuildDatabaseInitializationScript() { if (TransactionContext != null) { var sqlStatements = TransactionContextInitializer <TransactionContext> .GenerateMigrationStatements(TransactionContext); var sqlBuilder = new StringBuilder(); MigratorScriptingDecorator.BuildSqlScript(sqlStatements, sqlBuilder); return(sqlBuilder.ToString()); } return(null); }