Esempio n. 1
0
        public override void CreateTables()
        {
            var operations = _modelDiffer.GetDifferences(null, Model);
            var statements = _migrationsSqlGenerator.Generate(operations, Model);

            _executor.ExecuteNonQuery(_connection, null, statements);
        }
Esempio n. 2
0
        public virtual string GetCreateScript()
        {
            var operations = _modelDiffer.GetDifferences(null, _model.Value);
            var commands   = _migrationsSqlGenerator.Generate(operations, _model.Value);

            return(string.Concat(commands.Select(c => c.CommandText)));
        }
        public static void DropTables(this DbContext dbContext,
                                      IMigrationsModelDiffer modelDiffer,
                                      IMigrationsSqlGenerator sqlGenerator,
                                      bool failSilently = false)
        {
            var downOperations    = modelDiffer.GetDifferences(dbContext.Model, null);
            var sqlDownOperations = sqlGenerator.Generate(downOperations);

            using (var t = dbContext.Database.BeginTransaction())
            {
                foreach (var operation in sqlDownOperations)
                {
                    try
                    {
                        operation.ExecuteNonQuery(t.Connection);
                    }
                    catch (Exception e)
                    {
                        if (!failSilently)
                        {
                            throw e;
                        }
                    }
                }
                t.Commit();
            }
        }
        public override void CreateTables()
        {
            var operations = _modelDiffer.GetDifferences(null, Model);
            var commands   = _migrationsSqlGenerator.Generate(operations, Model);

            // Adding a PostgreSQL extension might define new types (e.g. hstore), which we
            // Npgsql to reload
            var reloadTypes = operations.Any(o => o is AlterDatabaseOperation && PostgresExtension.GetPostgresExtensions(o).Any());

            MigrationCommandExecutor.ExecuteNonQuery(commands, Connection);

            if (reloadTypes)
            {
                var npgsqlConn = (NpgsqlConnection)Connection.DbConnection;
                if (npgsqlConn.FullState == ConnectionState.Open)
                {
                    npgsqlConn.ReloadTypes();
                }
            }
        }
Esempio n. 5
0
        public virtual string GetCreateScript()
        {
            var operations = _modelDiffer.GetDifferences(null, _model.Value);
            var commands   = _migrationsSqlGenerator.Generate(operations, _model.Value);

            if (commands.Count != 1)
            {
                throw new InvalidOperationException(RelationalStrings.InvalidCreateScript);
            }

            return(commands[0].CommandText);
        }
Esempio n. 6
0
        public virtual string GetCreateScript()
        {
            var operations = _modelDiffer.GetDifferences(null, _model.Value);
            var batches    = _migrationsSqlGenerator.Generate(operations, _model.Value);

            if (batches.Count != 1 || batches[0].SuppressTransaction)
            {
                throw new InvalidOperationException(Strings.InvalidCreateScript);
            }

            return(batches[0].Sql);
        }
        public static void CreateTablesIfNotExists(this DbContext dbContext,
                                                   IMigrationsModelDiffer modelDiffer,
                                                   IMigrationsSqlGenerator sqlGenerator,
                                                   IEntityFrameworkDataProvider dataProvider)
        {
            var upOperations = modelDiffer.GetDifferences(null, dbContext.Model);

            var tables = upOperations.Where(o => o is CreateTableOperation).Cast <CreateTableOperation>().Select(o => o.Name);

            if (!dataProvider.TablesExist(dbContext.Database, tables))// alguna tabla fue eliminada
            {
                dbContext.DropTables(modelDiffer, sqlGenerator, true);

                //Crear nuevamente las tablas
                var sqlOperations = sqlGenerator.Generate(upOperations);

                using (var t = dbContext.Database.BeginTransaction())
                {
                    sqlOperations.ExecuteNonQuery(t.Connection);
                    t.Commit();
                }
            }
        }
        public virtual ScaffoldedMigration ScaffoldMigration(
            [NotNull] string migrationName,
            [NotNull] string rootNamespace,
            [CanBeNull] string subNamespace = null)
        {
            Check.NotEmpty(migrationName, nameof(migrationName));
            Check.NotEmpty(rootNamespace, nameof(rootNamespace));

            if (_migrationsAssembly.FindMigrationId(migrationName) != null)
            {
                throw new InvalidOperationException(CommandsStrings.DuplicateMigrationName(migrationName));
            }

            var subNamespaceDefaulted = false;

            if (string.IsNullOrEmpty(subNamespace))
            {
                subNamespaceDefaulted = true;
                subNamespace          = "Migrations";
            }

            var lastMigration = _migrationsAssembly.Migrations.LastOrDefault();

            var migrationNamespace = rootNamespace + "." + subNamespace;

            if (subNamespaceDefaulted)
            {
                migrationNamespace = GetNamespace(lastMigration.Value?.AsType(), migrationNamespace);
            }

            var sanitizedContextName = _contextType.Name;
            var genericMarkIndex     = sanitizedContextName.IndexOf('`');

            if (genericMarkIndex != -1)
            {
                sanitizedContextName = sanitizedContextName.Substring(0, genericMarkIndex);
            }

            if (ContainsForeignMigrations(migrationNamespace))
            {
                if (subNamespaceDefaulted)
                {
                    var builder = new StringBuilder()
                                  .Append(rootNamespace)
                                  .Append(".Migrations.");

                    if (sanitizedContextName.EndsWith("Context"))
                    {
                        builder.Append(sanitizedContextName.Substring(0, sanitizedContextName.Length - 7));
                    }
                    else
                    {
                        builder
                        .Append(sanitizedContextName)
                        .Append("Migrations");
                    }

                    migrationNamespace = builder.ToString();
                }
                else
                {
                    _logger.Value.LogWarning(CommandsStrings.ForeignMigrations(migrationNamespace));
                }
            }

            var modelSnapshot  = _migrationsAssembly.ModelSnapshot;
            var lastModel      = modelSnapshot?.Model;
            var upOperations   = _modelDiffer.GetDifferences(lastModel, _model);
            var downOperations = upOperations.Any()
                ? _modelDiffer.GetDifferences(_model, lastModel)
                : new List <MigrationOperation>();
            var migrationId            = _idGenerator.GenerateId(migrationName);
            var modelSnapshotNamespace = GetNamespace(modelSnapshot?.GetType(), migrationNamespace);

            var modelSnapshotName = sanitizedContextName + "ModelSnapshot";

            if (modelSnapshot != null)
            {
                var lastModelSnapshotName = modelSnapshot.GetType().Name;
                if (lastModelSnapshotName != modelSnapshotName)
                {
                    _logger.Value.LogDebug(CommandsStrings.ReusingSnapshotName(lastModelSnapshotName));

                    modelSnapshotName = lastModelSnapshotName;
                }
            }

            if (upOperations.Any(o => o.IsDestructiveChange))
            {
                _logger.Value.LogWarning(CommandsStrings.DestructiveOperation);
            }

            var migrationCode = _migrationCodeGenerator.GenerateMigration(
                migrationNamespace,
                migrationName,
                upOperations,
                downOperations);
            var migrationMetadataCode = _migrationCodeGenerator.GenerateMetadata(
                migrationNamespace,
                _contextType,
                migrationName,
                migrationId,
                _model);
            var modelSnapshotCode = _migrationCodeGenerator.GenerateSnapshot(
                modelSnapshotNamespace,
                _contextType,
                modelSnapshotName,
                _model);

            return(new ScaffoldedMigration(
                       _migrationCodeGenerator.FileExtension,
                       lastMigration.Key,
                       migrationCode,
                       migrationId,
                       migrationMetadataCode,
                       GetSubNamespace(rootNamespace, migrationNamespace),
                       modelSnapshotCode,
                       modelSnapshotName,
                       GetSubNamespace(rootNamespace, modelSnapshotNamespace)));
        }
Esempio n. 9
0
        /// <summary>
        /// Table rebuild according to https://sqlite.org/lang_altertable.html
        /// </summary>
        private IEnumerable <MigrationOperation> GenerateTableRebuilds(IModel model)
        {
            var operations = new List <MigrationOperation>();

            foreach (var table in _tableRebuilds)
            {
                var diffs = _migrationsModelDiffer.GetDifferences(null, model);

                var createTableOperation = (CreateTableOperation)diffs.First(y =>
                                                                             y.GetType() == typeof(CreateTableOperation) && ((CreateTableOperation)y).Name == table.Key);

                createTableOperation.Name = table.Key + "_new";

                var indexOperations = diffs.Where(
                    y => y.GetType() == typeof(CreateIndexOperation) &&
                    ((CreateIndexOperation)y).Name.StartsWith($"IX_{table.Key}_", StringComparison.Ordinal)).ToList();

                operations.Add(new SqlOperation {
                    Sql = "PRAGMA foreign_keys=OFF;", SuppressTransaction = true
                });

                operations.Add(createTableOperation);

                var insertColumns = createTableOperation.Columns.Select(y => y.Name).ToArray();

                var selectColumns = new List <string>();

                foreach (var insertColumn in insertColumns)
                {
                    var renameColumnOperation = table.Value.FirstOrDefault(y => y.NewName == insertColumn);

                    if (renameColumnOperation != null)
                    {
                        selectColumns.Add(renameColumnOperation.Name);
                    }
                    else
                    {
                        selectColumns.Add(insertColumn);
                    }
                }

                operations.Add(new SqlOperation
                {
                    Sql = $"INSERT INTO {table.Key + "_new"} ({ColumnList(insertColumns)}) " +
                          $"SELECT {ColumnList(selectColumns.ToArray())} FROM {table.Key}"
                });

                operations.Add(new DropTableOperation {
                    Name = table.Key
                });

                operations.Add(new RenameTableOperation {
                    Name = table.Key + "_new", NewName = table.Key
                });

                operations.AddRange(indexOperations);

                operations.Add(new SqlOperation {
                    Sql = "PRAGMA foreign_keys=ON;", SuppressTransaction = true
                });
            }

            return(operations);
        }
 protected virtual IEnumerable <IRelationalCommand> GetCreateTablesCommands()
 => _migrationsSqlGenerator.Generate(_modelDiffer.GetDifferences(null, Model), Model);
        public virtual ScaffoldedMigration ScaffoldMigration(
            [NotNull] string migrationName,
            [NotNull] string rootNamespace)
        {
            Check.NotEmpty(migrationName, nameof(migrationName));
            Check.NotEmpty(rootNamespace, nameof(rootNamespace));

            if (_migrationsAssembly.FindMigrationId(migrationName) != null)
            {
                throw new InvalidOperationException(CommandsStrings.DuplicateMigrationName(migrationName));
            }

            var lastMigration      = _migrationsAssembly.Migrations.LastOrDefault();
            var migrationNamespace = GetNamespace(lastMigration.Value?.AsType(), rootNamespace + ".Migrations");
            var modelSnapshot      = _migrationsAssembly.ModelSnapshot;
            var lastModel          = modelSnapshot?.Model;
            var upOperations       = _modelDiffer.GetDifferences(lastModel, _model);
            var downOperations     = upOperations.Any()
                ? _modelDiffer.GetDifferences(_model, lastModel)
                : new List <MigrationOperation>();
            var migrationId            = _idGenerator.GenerateId(migrationName);
            var modelSnapshotNamespace = GetNamespace(modelSnapshot?.GetType(), migrationNamespace);

            var modelSnapshotName = _contextType.Name + "ModelSnapshot";

            if (modelSnapshot != null)
            {
                var lastModelSnapshotName = modelSnapshot.GetType().Name;
                if (lastModelSnapshotName != modelSnapshotName)
                {
                    _logger.Value.LogVerbose(CommandsStrings.ReusingSnapshotName(lastModelSnapshotName));

                    modelSnapshotName = lastModelSnapshotName;
                }
            }

            if (upOperations.Any(o => o.IsDestructiveChange))
            {
                _logger.Value.LogWarning(CommandsStrings.DestructiveOperation);
            }

            var migrationCode = _migrationCodeGenerator.GenerateMigration(
                migrationNamespace,
                migrationName,
                upOperations,
                downOperations);
            var migrationMetadataCode = _migrationCodeGenerator.GenerateMetadata(
                migrationNamespace,
                _contextType,
                migrationName,
                migrationId,
                _model);
            var modelSnapshotCode = _migrationCodeGenerator.GenerateSnapshot(
                modelSnapshotNamespace,
                _contextType,
                modelSnapshotName,
                _model);

            return(new ScaffoldedMigration(
                       _migrationCodeGenerator.FileExtension,
                       lastMigration.Key,
                       migrationCode,
                       migrationId,
                       migrationMetadataCode,
                       GetSubnamespace(rootNamespace, migrationNamespace),
                       modelSnapshotCode,
                       modelSnapshotName,
                       GetSubnamespace(rootNamespace, modelSnapshotNamespace)));
        }
Esempio n. 12
0
 /// <summary>
 ///     Gets the commands that will create all tables from the model.
 /// </summary>
 /// <returns> The generated commands. </returns>
 protected virtual IReadOnlyList <MigrationCommand> GetCreateTablesCommands()
 => _migrationsSqlGenerator.Generate(_modelDiffer.GetDifferences(null, Model), Model);
Esempio n. 13
0
 private IEnumerable <SqlBatch> CreateSchemaCommands()
 => _sqlGenerator.Generate(_modelDiffer.GetDifferences(null, Model), Model);