예제 #1
0
        /// <summary>
        /// Initializes the database.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <inheritdoc />
        public virtual void InitializeDatabase(TContext context)
        {
            if (_config == null)
            {
                _config = new TMigrationsConfiguration
                {
                    TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient")
                };
            }

            var seed     = !context.Database.Exists();
            var migrator = new DbMigrator(_config);

            if (!seed)
            {
                var local   = migrator.GetLocalMigrations();
                var pending = migrator.GetPendingMigrations();
                if (local.Count() == pending.Count())
                {
                    seed = true;
                }
            }

            migrator.Update();
            InitializeDbSettings(context);

            if (seed)
            {
                Seed(context);
            }
        }
예제 #2
0
        private static IEnumerable <string> GetPendingResourceMigrations(DbMigrator migrator, string resHead)
        {
            var local  = migrator.GetLocalMigrations();
            var atHead = false;

            if (local.Last().IsCaseInsensitiveEqual(resHead))
            {
                yield break;
            }

            foreach (var id in local)
            {
                if (!atHead)
                {
                    if (!id.IsCaseInsensitiveEqual(resHead))
                    {
                        continue;
                    }
                    else
                    {
                        atHead = true;
                        continue;
                    }
                }

                yield return(id);
            }
        }
예제 #3
0
        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);
        }
        void IDatabaseInitializer <TContext> .InitializeDatabase(TContext context)
        {
            Contract.Requires(context != null, "context");

            if (context.Database.Exists())
            {
                var shouldCreate = false;
                try
                {
                    if (!context.Database.CompatibleWithModel(throwIfNoMetadata: true))
                    {
                        try
                        {
                            shouldCreate = true;
                            if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
                            {
                                shouldCreate = false;
                                Console.WriteLine("Updating Database...");
                                var migrator = new DbMigrator(_configuration);
                                migrator.Update();
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e);
                        }
                    }
                }
                catch (Exception ex)
                {
                    shouldCreate = true;
                }
                if (shouldCreate)
                {
                    try
                    {
                        Console.WriteLine("Running Migrations...");
                        var migrator = new DbMigrator(_configuration);
                        foreach (var localMigration in migrator.GetLocalMigrations())
                        {
                            migrator.Update(localMigration);
                        }
                        Seed(context);
                        context.SaveChanges();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                    }
                }
            }
            else
            {
                Console.WriteLine("Creating Database...");
                context.Database.Create();
                Seed(context);
                context.SaveChanges();
            }
        }
예제 #5
0
        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")));
        }
예제 #6
0
        /// <summary>
        /// Проверяет установлена ли последняя миграция
        /// </summary>
        /// <returns>Результат проверки миграций</returns>
        public string CheckLastMigration()
        {
            var migrator = new DbMigrator(_configuration);

            var targetMigration = migrator.GetLocalMigrations().ToList();

            var targetMigrationDb = migrator.GetDatabaseMigrations(null, false).ToList();

            return(migrator.CheckMigrations(targetMigration.LastOrDefault(), targetMigrationDb.LastOrDefault(), false));
        }
예제 #7
0
        private static void ShowAll(DbManagerOptions options)
        {
            var migrator = new DbMigrator(new TMigrationConfig());

            Logger.Info("Возможный следующие миграции:");
            migrator.GetLocalMigrations().ForEach(m => Logger.Info(m));

            Logger.Info("Миграции примененные к базе данных:");
            migrator.GetDatabaseMigrations().ForEach(m => Logger.Info(m));
        }
예제 #8
0
        /// <summary>
        ///     Возвращает Id для последней миграции
        /// </summary>
        /// <param name="migrator">Мигратор</param>
        /// <param name="downgrade">Является ли операция миграции</param>
        /// <returns>Id миграции</returns>
        private string GetLastMigrationId(DbMigrator migrator, bool downgrade)
        {
            var targetMigration = migrator.GetLocalMigrations().ToList();

            if (targetMigration.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, null));
            }

            return(downgrade ? null : targetMigration.Last());
        }
예제 #9
0
        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
        }
예제 #10
0
        /// <summary>
        ///     Возвращает Id миграции по версии миграции
        /// </summary>
        /// <param name="migrator">Мигратор</param>
        /// <param name="version">Номер версии</param>
        /// <returns>Id миграции</returns>
        private string GetMigrationIdByMigrationVersion(DbMigrator migrator, string version)
        {
            var targetMigration =
                migrator.GetLocalMigrations()
                .Where(s => s.ToLowerInvariant().StartsWith(version.ToLowerInvariant()))
                .ToList();

            if (targetMigration.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, version));
            }

            return(targetMigration.Last());
        }
예제 #11
0
        internal static Tuple <IEnumerable <string>, IEnumerable <string>, IEnumerable <string> > GetMigrationsInfo()
        {
            try
            {
                var migrator = new DbMigrator(new Migrations.Configuration());

                return(Tuple.Create(migrator.GetDatabaseMigrations(),
                                    migrator.GetLocalMigrations(), migrator.GetPendingMigrations()));
            }
            catch (MigrationsException ex)
            {
                throw new DataAccessException("Failed to retreive migrations information", ex);
            }
        }
예제 #12
0
        public static void UpdateDatabase(string connectionString)
        {
            var configuration = new Configuration
            {
                TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient")
            };

            var migrator = new DbMigrator(configuration);
            var pending  = migrator.GetPendingMigrations().ToArray();
            var local    = migrator.GetLocalMigrations().ToArray();
            var db       = migrator.GetDatabaseMigrations().ToArray();

            migrator.Update();
        }
예제 #13
0
        public void NoPendingMigrations()
        {
            var currentTimestamp = DateTimeOffset.UtcNow.ToString("yyyyMMddHHmmssFFFFFFF");

            _dbName = $"PendingMigrationsTest{currentTimestamp}Validation";
            var connectionString = $@"Data Source=(localdb)\mssqllocaldb; Initial Catalog={_dbName}; Integrated Security=True; MultipleActiveResultSets=True";

            var migrationsConfiguration = new ValidationMigrationsConfiguration
            {
                TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient"),
            };

            var dbMigrator = new DbMigrator(migrationsConfiguration);
            var migrations = dbMigrator.GetLocalMigrations();

            dbMigrator.Update(migrations.Last());

            var migrationScaffolder = new MigrationScaffolder(dbMigrator.Configuration);

            var migrationName = $"TestMigration{currentTimestamp}";
            var result        = migrationScaffolder.Scaffold(migrationName);

            _output.WriteLine("Migration content:");
            _output.WriteLine(new string('-', 60));
            _output.WriteLine(result.UserCode);
            _output.WriteLine(new string('-', 60));

            Assert.Equal(
                $@"namespace {dbMigrator.Configuration.MigrationsNamespace}
{{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class {migrationName} : DbMigration
    {{
        public override void Up()
        {{
        }}
        
        public override void Down()
        {{
        }}
    }}
}}
", result.UserCode);
        }
        public void InitializeDatabase(DbContext2Database context)
        {
            Contract.Requires(context != null, "context");

            var configuration = new DbContext2MigrationsConfiguration()
            {
                TargetDatabase = new DbConnectionInfo(_connection)
            };

            if (!context.Database.Exists() || !context.Database.CompatibleWithModel(throwIfNoMetadata: false))
            {
                var      migrator          = new DbMigrator(configuration);
                string[] pastMigrations    = migrator.GetDatabaseMigrations().OrderBy(s => s).ToArray();
                string[] knownMigrations   = migrator.GetLocalMigrations().OrderBy(s => s).ToArray();
                string[] pendingMigrations = migrator.GetPendingMigrations().OrderBy(s => s).ToArray();
                Console.Out.WriteLine("Known migrations:");
                foreach (var m in knownMigrations)
                {
                    Console.Out.WriteLine(m);
                }
                Console.Out.WriteLine("Past migrations:");
                foreach (var m in pastMigrations)
                {
                    Console.Out.WriteLine(m);
                }
                Console.Out.WriteLine("Pending migrations:");
                foreach (var m in pendingMigrations)
                {
                    Console.Out.WriteLine(m);
                }

                if (!pendingMigrations.Any())
                {
                    Console.Out.WriteLine($"Database mismatch: exists={context.Database.Exists()} and compatibility={context.Database.CompatibleWithModel(throwIfNoMetadata: false)} but there are no migrations pending.");
                }

                foreach (string s in migrator.GetPendingMigrations())
                {
                    Console.Out.WriteLine($"Applying database migration {s}.");
                    migrator.Update(s);
                }
            }

            context.SaveChanges();
        }
예제 #15
0
        public void Initialize(MockConnection solrConnection)
        {
            //if (SolrService.IsInitialized)
            //{
            //    //TODO: Inject the new connection into this current solr thread.
            //}
            //else
            //{
            //    SolrService.ForceInit(solrConnection);
            //}

            SolrService.ForceInit(solrConnection);

            try
            {
                Catfish.Tests.Migrations.Configuration config = new Catfish.Tests.Migrations.Configuration();
                var migrator = new DbMigrator(config);

                foreach (string migName in migrator.GetLocalMigrations())
                {
                    Type        migration = config.MigrationsAssembly.GetType(string.Format("{0}.{1}", config.MigrationsNamespace, migName.Substring(16)));
                    DbMigration m         = (DbMigration)Activator.CreateInstance(migration);
                    m.Up();

                    var prop = m.GetType().GetProperty("Operations", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    if (prop != null)
                    {
                        IEnumerable <MigrationOperation> operations = prop.GetValue(m) as IEnumerable <MigrationOperation>;
                        var generator  = config.GetSqlGenerator("System.Data.SQLite");
                        var statements = generator.Generate(operations, "2008");
                        foreach (MigrationStatement item in statements)
                        {
                            Db.Database.ExecuteSqlCommand(item.Sql);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
예제 #16
0
        /// <summary>
        ///     Возвращает Id миграции по имени
        /// </summary>
        /// <param name="migrator">Мигратор</param>
        /// <param name="migration">Название миграции</param>
        /// <returns>Id миграции</returns>
        private string GetMigrationIdByMigrationName(DbMigrator migrator, string migration)
        {
            var targetMigration =
                migrator.GetLocalMigrations()
                .Where(s => s.ToLowerInvariant().Contains(migration.ToLowerInvariant()))
                .ToList();

            if (targetMigration.Count > 1)
            {
                throw new MigrationsException(string.Format(Constants.NotUniqMigration,
                                                            Environment.NewLine,
                                                            targetMigration.Join(separator: Environment.NewLine)));
            }
            if (targetMigration.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, migration));
            }

            return(targetMigration.First());
        }
예제 #17
0
        public virtual IEnumerable <MigrationInfo> GetMigrations(String contextTypeName)
        {
            var contextType       = GetContextType(contextTypeName);
            var configurationType = GetConfigurationType(contextType);

            var configuration = CreateConfiguration(configurationType);
            var migrator      = new DbMigrator(configuration);

            var migrations = new Dictionary <String, MigrationInfo>();

            Func <String, MigrationInfo> getInfo = migrationId =>
            {
                MigrationInfo info;

                if (!migrations.TryGetValue(migrationId, out info))
                {
                    info = new MigrationInfo {
                        Id = migrationId
                    };
                    migrations.Add(migrationId, info);
                }

                return(info);
            };

            foreach (var migrationId in migrator.GetDatabaseMigrations())
            {
                var info = getInfo.Invoke(migrationId);

                info.InDatabase = true;
            }

            foreach (var migrationId in migrator.GetLocalMigrations())
            {
                var info = getInfo.Invoke(migrationId);

                info.InProject = true;
            }

            return(migrations.Values.OrderBy(i => i.Id));
        }
예제 #18
0
        /// <summary>
        /// Initializes the database.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <inheritdoc />
        public virtual void InitializeDatabase(TContext context)
        {
            if (_config == null)
            {
                _config = new TMigrationsConfiguration
                {
                    TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient")
                };
            }

            var seed     = !context.Database.Exists();
            var migrator = new DbMigrator(_config);

            if (!seed)
            {
                var local   = migrator.GetLocalMigrations();
                var pending = migrator.GetPendingMigrations();
                if (local.Count() == pending.Count())
                {
                    seed = true;
                }
            }

            try
            {
                migrator.Update();
            }
            catch (SqlException ex)
            {
                throw new ApplicationException(String.Format("Migrations failed with error \"{0}\"", ex.ExpandExceptionMessage()), ex);
            }

            InitializeDbSettings(context);

            if (seed)
            {
                Seed(context);
            }
        }
        private void EnsureAllExplicitMigrationsAddedAndMigrate(TContext context, DbMigrator migrator)
        {
            var pendinMigrations = migrator.GetPendingMigrations().Count();
            var localMigrations  = migrator.GetLocalMigrations().Count();
            var exists           = context.Database.Exists();

            if (!exists || pendinMigrations > 0)
            {
                try
                {
                    migrator.Update();
                }
                catch (SqlException)
                {
                    throw new ApplicationException();
                }

                if (pendinMigrations == localMigrations)
                {
                    Seed(context);
                }
            }
        }
예제 #20
0
        /// <summary>
        /// Проверяет наличие миграции в БД по ее версии
        /// </summary>
        /// <param name="version">Версия миграции</param>
        /// <returns>Результат проверки миграций</returns>
        public string CheckByVersion(string version)
        {
            var migrator = new DbMigrator(_configuration);

            var targetMigration =
                migrator.GetLocalMigrations()
                .Where(s => s.ToLowerInvariant().StartsWith(version.ToLowerInvariant()))
                .ToList();

            if (targetMigration.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, version));
            }

            var targetMigrationDb = migrator.GetDatabaseMigrations(version, true).ToList();

            if (targetMigrationDb.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, version));
            }

            return(migrator.CheckMigrations(targetMigration.Last(), targetMigrationDb.Last(), true));
        }
예제 #21
0
        /// <summary>
        /// Ищет конкретную миграцию в БД по имени миграции
        /// </summary>
        /// <param name="migration">Название миграции</param>
        /// <returns>Результат проверки миграций</returns>
        public string CheckByMigrationName(string migration)
        {
            var migrator = new DbMigrator(_configuration);

            var targetMigration =
                migrator.GetLocalMigrations()
                .Where(s => s.ToLowerInvariant().Contains(migration.ToLowerInvariant()))
                .ToList();

            if (targetMigration.Count > 1)
            {
                throw new MigrationsException(string.Format(Constants.NotUniqMigration,
                                                            Environment.NewLine,
                                                            targetMigration.Join(separator: Environment.NewLine)));
            }

            if (targetMigration.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, migration));
            }

            var targetMigrationDb = migrator.GetDatabaseMigrations(migration, false).ToList();

            if (targetMigrationDb.Count > 1)
            {
                throw new MigrationsException(string.Format(Constants.NotUniqMigration,
                                                            Environment.NewLine,
                                                            targetMigrationDb.Join(separator: Environment.NewLine)));
            }

            if (targetMigrationDb.Count == 0)
            {
                throw new MigrationsException(string.Format(Constants.MigrationNotFound, migration));
            }

            return(migrator.CheckMigrations(targetMigration.First(), targetMigrationDb.First(), false));
        }
예제 #22
0
        public void MigrateDatabase()
        {
            //Arrange

            Animals.Migrations.Configuration config = new Configuration();
            DbMigrator migrator = new DbMigrator(config);

            Console.WriteLine("Past migrations:");
            foreach (string s in migrator.GetDatabaseMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Local migrations:");
            foreach (string s in migrator.GetLocalMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Pending migrations:");
            foreach (string s in migrator.GetPendingMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Migrating...");
            foreach (string s in migrator.GetPendingMigrations())
            {
                //Act
                Console.WriteLine("Applying migration {0}", s);
                Action act = () => migrator.Update(s);

                //Assert
                act.ShouldNotThrow();
            }
        }
예제 #23
0
 /// <summary>
 /// Gets array of all versions
 /// </summary>
 /// <returns>Array of versions</returns>
 public string[] GetAllVersions()
 {
     return(_migrator.GetLocalMigrations().OrderBy(m => m).ToArray());
 }
예제 #24
0
        public static void MigrateDatabase(Tenant tenant)        //string DBName/*VentasDBContext ctx*/)
        {
            //context.Database.Create();
            //var datab = context.Database;
            //Tenant tenant = new Tenant();
            using (var context = new TenantsDBContext())
            {
                //tenant.BaseDeDatos = DBName;
                tenant.ConnectionString = "data source=DESKTOP-JSIT42C\\SQLEXPRESS; MultipleActiveResultSets=true ;initial catalog=" + tenant.BaseDeDatos + "; integrated security=SSPI";
                tenant.Host             = (System.Environment.MachineName == "DESKTOP-JSIT42C") ? "DESKTOP-JSIT42C\\SQLEXPRESS" : "localhost";
                tenant.Nombre           = tenant.BaseDeDatos;

                context.Tenants.Add(tenant);
                context.SaveChanges();
            }
            Common.TenantData.tenant = tenant;
            //using (var context = new VentasDBContext(tenant.ConnectionString))
            //{
            //	UltimoDiario u = new UltimoDiario();
            //	u.UltimaFechaImpresion = tenant.FechaImpresionUltimoDiario;
            //	u.UltimoNumeroAsiento = 1;
            //	u.UltimoNumeroFolio = 1;
            //	u.UltimoNumeroRenglon = 1;
            //	u.UltimoNumeroTransporte = 1;
            //	context.UltimoDiario.Add(u);
            //	context.SaveChanges();
            //}
            var newDbConnString   = "data source=DESKTOP-JSIT42C\\SQLEXPRESS; MultipleActiveResultSets=true ;initial catalog=" + tenant.BaseDeDatos + "; integrated security=SSPI";          //context.Database.Connection.ConnectionString;
            var connStringBuilder = new SqlConnectionStringBuilder(newDbConnString);


            connStringBuilder.InitialCatalog = tenant.BaseDeDatos;

            ConfigurationVentas config   = new ConfigurationVentas();
            DbMigrator          migrator = new DbMigrator(config);

            VentasDBContext ctx = new VentasDBContext(newDbConnString);

            ctx.Database.Create();

            Console.WriteLine("Past migrations:");
            foreach (string s in migrator.GetDatabaseMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Local migrations:");
            foreach (string s in migrator.GetLocalMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Pending migrations:");
            foreach (string s in migrator.GetPendingMigrations())
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("Migrating...");
            foreach (string s in migrator.GetLocalMigrations())            //GetPendingMigrations())
            {
                //Act
                Console.WriteLine("Applying migration {0}", s);
                Action act = () => migrator.Update(s);

                //Assert
                //act.ShouldNotThrow();
            }
        }
 public IEnumerable <string> GetLocalMigrations()
 {
     return(_migrator.GetLocalMigrations());
 }
예제 #26
0
 /// <summary>
 /// Gets all migrations that are defined in the configured migrations assembly.
 /// </summary>
 /// <returns>List of migrations</returns>
 public IEnumerable <string> GetLocalMigrations()
 {
     AssertForReady();
     return(_dbMigrator.GetLocalMigrations());
 }
예제 #27
0
 /// <summary>
 /// Gets all migrations that are defined in the current version
 /// </summary>
 /// <returns>Array of database migration names</returns>
 public string[] GetLocalMigrations()
 {
     return(_migrator.GetLocalMigrations().ToArray());
 }