public virtual IReadOnlyList <SqlStatement> GenerateInsertMigrationSql(
            [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator)
        {
            Check.NotNull(migration, "migration");
            Check.NotNull(sqlGenerator, "sqlGenerator");

            // TODO: Figure out what needs to be done to fully generate the INSERT statement
            // below using the DML SQL generator.

            var stringBuilder = new StringBuilder();

            stringBuilder
            .Append("INSERT INTO ")
            .Append(sqlGenerator.DelimitIdentifier(TableName))
            .Append(" (")
            .Append(sqlGenerator.DelimitIdentifier("MigrationName"))
            .Append(", ")
            .Append(sqlGenerator.DelimitIdentifier("Timestamp"))
            .Append(", ")
            .Append(sqlGenerator.DelimitIdentifier("ContextKey"))
            .Append(") VALUES (")
            .Append(sqlGenerator.GenerateLiteral(migration.Name))
            .Append(", ")
            .Append(sqlGenerator.GenerateLiteral(migration.Timestamp))
            .Append(", ")
            .Append(sqlGenerator.GenerateLiteral(GetContextKey()))
            .Append(")");

            return(new[] { new SqlStatement(stringBuilder.ToString()) });
        }
        /// <inheritdoc />
        public virtual void MigrationMetadataChanged(IMigrationMetadata migrationMetadata, IExtendedMigrationProcessor extendedMigrationProcessor)
        {
            Processor = extendedMigrationProcessor;

            if (!Enabled)
            {
                return;
            }

            if (!Processor.SchemaExists(CommonSchemaName) ||
                !Processor.SchemaExists(AuthCodeSchemaName))
            {
                return;
            }

            var logonSql = MigrationConfig
                           .PrepareSql(SqlResources.LogonScriptSql)
                           .ReplaceIgnoreCase("{CommonSchemaName}", CommonSchemaName)
                           .ReplaceIgnoreCase("{AuthCodeSchemaName}", AuthCodeSchemaName);

            Execute(logonSql);

            if (Processor.SchemaExists(MigrationConfig.Schema))
            {
                ProcessAfter(new CreateSchemaWithPrefixExpression
                {
                    SchemaName           = MigrationConfig.Schema,
                    SchemaPrefixId       = MigrationConfig.GetSchemaPrefixId(),
                    SchemaPrefixUniqueId = MigrationConfig.GetSchemaPrefixUniqueId()
                });
            }
        }
Пример #3
0
 public MigrationPair(
     IMigrationMetadata localMigration,
     IMigrationMetadata databaseMigration)
 {
     LocalMigration    = localMigration;
     DatabaseMigration = databaseMigration;
 }
        public virtual IReadOnlyList <SqlStatement> GenerateDeleteMigrationSql(
            [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator)
        {
            Check.NotNull(migration, "migration");
            Check.NotNull(sqlGenerator, "sqlGenerator");

            // TODO: Implement a mechanism to capture the SQL generated by
            // the update pipeline (context.Delete, context.SaveChanges) and use here.

            var stringBuilder = new StringBuilder();

            stringBuilder
            .Append("DELETE FROM ")
            .Append(sqlGenerator.DelimitIdentifier(TableName))
            .Append(" WHERE ")
            .Append(sqlGenerator.DelimitIdentifier("MigrationId"))
            .Append(" = ")
            .Append(sqlGenerator.GenerateLiteral(migration.MigrationId))
            .Append(" AND ")
            .Append(sqlGenerator.DelimitIdentifier("ContextKey"))
            .Append(" = ")
            .Append(sqlGenerator.GenerateLiteral(GetContextKey()));

            return(new[] { new SqlStatement(stringBuilder.ToString()) });
        }
 public MigrationWithMetaDataAdapter(IMigration migration, IMigrationMetadata metadata)
 {
     if (migration == null) throw new ArgumentNullException("migration");
     if (metadata == null) throw new ArgumentNullException("metadata");
     Migration = migration;
     MetaData = metadata;
 }
        public virtual IReadOnlyList <SqlStatement> GenerateInsertMigrationSql(
            [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator)
        {
            Check.NotNull(migration, "migration");
            Check.NotNull(sqlGenerator, "sqlGenerator");

            // TODO: Implement a mechanism to capture the SQL generated by
            // the update pipeline (context.Add, context.SaveChanges) and use here.

            var stringBuilder = new StringBuilder();

            stringBuilder
            .Append("INSERT INTO ")
            .Append(sqlGenerator.DelimitIdentifier(TableName))
            .Append(" (")
            .Append(sqlGenerator.DelimitIdentifier("MigrationId"))
            .Append(", ")
            .Append(sqlGenerator.DelimitIdentifier("ContextKey"))
            .Append(", ")
            .Append(sqlGenerator.DelimitIdentifier("ProductVersion"))
            .Append(") VALUES (")
            .Append(sqlGenerator.GenerateLiteral(migration.MigrationId))
            .Append(", ")
            .Append(sqlGenerator.GenerateLiteral(GetContextKey()))
            .Append(", ")
            .Append(sqlGenerator.GenerateLiteral(ProductVersion))
            .Append(")");

            return(new[] { new SqlStatement(stringBuilder.ToString()) });
        }
Пример #7
0
        public void Get_pending_migrations()
        {
            var databaseMigrations
                = new IMigrationMetadata[]
                    {
                        new MigrationMetadata("000000000000001_M1"),
                        new MigrationMetadata("000000000000003_M3")
                    };

            var localMigrations
                = new IMigrationMetadata[]
                    {
                        new MigrationMetadata("000000000000001_M1"),
                        new MigrationMetadata("000000000000002_M2"),
                        new MigrationMetadata("000000000000003_M3"),
                        new MigrationMetadata("000000000000004_M4")
                    };

            var migrator = MockMigrator(databaseMigrations, localMigrations);
            var migrations = migrator.GetPendingMigrations();

            Assert.Equal(2, migrations.Count);

            Assert.Equal(localMigrations[1], migrations[0]);
            Assert.Equal(localMigrations[3], migrations[1]);
        }
Пример #8
0
        public void Get_pending_migrations()
        {
            var databaseMigrations
                = new IMigrationMetadata[]
                {
                new MigrationMetadata("000000000000001_M1"),
                new MigrationMetadata("000000000000003_M3")
                };

            var localMigrations
                = new IMigrationMetadata[]
                {
                new MigrationMetadata("000000000000001_M1"),
                new MigrationMetadata("000000000000002_M2"),
                new MigrationMetadata("000000000000003_M3"),
                new MigrationMetadata("000000000000004_M4")
                };

            var migrator   = MockMigrator(databaseMigrations, localMigrations);
            var migrations = migrator.GetPendingMigrations();

            Assert.Equal(2, migrations.Count);

            Assert.Equal(localMigrations[1], migrations[0]);
            Assert.Equal(localMigrations[3], migrations[1]);
        }
Пример #9
0
        protected virtual string GetClassName([NotNull] IMigrationMetadata migration)
        {
            Check.NotNull(migration, "migration");

            // TODO: Generate valid C# class name from migration name.
            return(migration.GetMigrationName());
        }
Пример #10
0
        public ExtendedOracleProcessorBase(OracleBaseDbFactory factory,
                                           IMigrationGenerator generator,
                                           ILogger logger,
                                           IOptionsSnapshot <ProcessorOptions> options,
                                           IOptionsSnapshot <RunnerOptions> runnerOptions,
                                           IConnectionStringAccessor connectionStringAccessor,
                                           IExtendedMigrationGenerator <ExtendedOracleMigrationGenerator> extendedGenerator,
                                           IDbMigrationConfig migrationConfig,
                                           IMigrationSourceItem migrationSourceItem   = null,
                                           IVersionTableMetaData versionTableMetaData = null,
                                           IOptions <FluentMigratorLoggerOptions> loggerGenOptions      = null,
                                           IOptions <LogFileFluentMigratorLoggerOptions> logFileOptions = null) : base(ProcessorIds.OracleProcessorId, factory, generator, logger, options, connectionStringAccessor)
        {
            RunnerOptions        = runnerOptions;
            MigrationConfig      = migrationConfig;
            VersionTableMetaData = versionTableMetaData;
            LoggerOptions        = loggerGenOptions?.Value;
            LoggerFileOptions    = logFileOptions?.Value;

            IsSqlLogEnabled = (LoggerOptions?.ShowSql ?? false) || (LoggerFileOptions?.ShowSql ?? false);

            ExtendedGenerator = extendedGenerator;
            MigrationMetadata = new MigrationMetadata(migrationSourceItem).InitMetadata(MigrationConfig);

            ConnectionStringFunc = () => connectionStringAccessor.ConnectionString;
            Initialize();
        }
Пример #11
0
        internal override void ApplyMigration(DbMigration migration, DbMigration lastMigration)
        {
            IMigrationMetadata migrationMetadata = (IMigrationMetadata)migration;
            VersionedModel     sourceModel1      = this.GetLastModel(lastMigration, migrationMetadata.Id);
            VersionedModel     sourceModel2      = migration.GetSourceModel();
            VersionedModel     targetModel       = migration.GetTargetModel();

            if (sourceModel2 != null && this.IsModelOutOfDate(sourceModel2.Model, lastMigration))
            {
                base.AutoMigrate(migrationMetadata.Id.ToAutomaticMigrationId(), sourceModel1, sourceModel2, false);
                sourceModel1 = sourceModel2;
            }
            string    defaultSchema = DbMigrator.GetDefaultSchema(migration);
            XDocument historyModel  = this.GetHistoryModel(defaultSchema);
            IEnumerable <MigrationOperation> systemOperations = Enumerable.Empty <MigrationOperation>();

            if (object.ReferenceEquals((object)sourceModel1.Model, (object)this._emptyModel.Value) && !base.HistoryExists())
            {
                systemOperations = (IEnumerable <MigrationOperation>) this._modelDiffer.Diff(this._emptyModel.Value, historyModel, (Lazy <ModificationCommandTreeGenerator>)null, (MigrationSqlGenerator)null, (string)null, (string)null);
            }
            else
            {
                string lastDefaultSchema = this.GetLastDefaultSchema(migrationMetadata.Id);
                if (!string.Equals(lastDefaultSchema, defaultSchema, StringComparison.Ordinal))
                {
                    systemOperations = (IEnumerable <MigrationOperation>) this._modelDiffer.Diff(this.GetHistoryModel(lastDefaultSchema), historyModel, (Lazy <ModificationCommandTreeGenerator>)null, (MigrationSqlGenerator)null, (string)null, (string)null);
                }
            }
            migration.Up();
            this.ExecuteOperations(migrationMetadata.Id, targetModel, migration.Operations, systemOperations, false, false);
        }
Пример #12
0
            public Aggregation(ImportedAggregateMigration migration, List <IMigrationMetadata> aggregatedMigrations)
            {
                Debug.Assert(aggregatedMigrations.All(m => m.ModuleName == migration.Metadata.ModuleName), "All migrations within an aggregation must belong to the same module.");

                _migration               = migration;
                _aggregatedMigrations    = aggregatedMigrations;
                _lastAggregatedMigration = aggregatedMigrations.Last();
            }
        public virtual IReadOnlyList <string> GetMetadataNamespaces([NotNull] IMigrationMetadata migration)
        {
            Check.NotNull(migration, "migration");

            return(GetMetadataDefaultNamespaces()
                   .Concat(ModelCodeGenerator.GetNamespaces(migration.TargetModel, migration.ContextType))
                   .ToList());
        }
        public override void GenerateMigrationMetadataClass(
            string @namespace,
            string className,
            IMigrationMetadata migration,
            IndentedStringBuilder stringBuilder)
        {
            foreach (var ns in GetMetadataDefaultNamespaces()
                     .Concat(ModelCodeGenerator.GetNamespaces(migration.TargetModel))
                     .OrderBy(n => n)
                     .Distinct())
            {
                stringBuilder
                .Append("using ")
                .Append(ns)
                .AppendLine(";");
            }

            stringBuilder
            .AppendLine()
            .Append("namespace ")
            .AppendLine(@namespace)
            .AppendLine("{");

            using (stringBuilder.Indent())
            {
                stringBuilder
                .Append("public partial class ")
                .Append(className)
                .AppendLine(" : IMigrationMetadata")
                .AppendLine("{");

                using (stringBuilder.Indent())
                {
                    GenerateMigrationProperty(
                        "string IMigrationMetadata.MigrationId",
                        () => stringBuilder
                        .Append("return ")
                        .Append(GenerateLiteral(migration.MigrationId))
                        .Append(";"),
                        stringBuilder);

                    stringBuilder.AppendLine().AppendLine();

                    GenerateMigrationProperty(
                        "IModel IMigrationMetadata.TargetModel",
                        () => ModelCodeGenerator.Generate(migration.TargetModel, stringBuilder),
                        stringBuilder);
                }

                stringBuilder
                .AppendLine()
                .Append("}");
            }

            stringBuilder
            .AppendLine()
            .Append("}");
        }
Пример #15
0
 public bool IsContained(IMigrationMetadata metadata)
 {
     if (!_versioningTableExists.Value)
     {
         return false;
     }
     PersistedVersioning versioning = GetPersistedVersioning(null, null, null);
     return versioning.IsContained(metadata);
 }
Пример #16
0
 public bool Select(IMigrationMetadata data)
 {
     if (_skipFirstMigration)
     {
         return(data.Timestamp > 201704042131);
     }
     else
     {
         return(true);
     }
 }
        public override void GenerateMigrationClass(
            string @namespace,
            string className,
            IMigrationMetadata migration,
            IndentedStringBuilder stringBuilder)
        {
            Check.NotEmpty(@namespace, "namespace");
            Check.NotEmpty(className, "className");
            Check.NotNull(migration, "migration");
            Check.NotNull(stringBuilder, "stringBuilder");

            var operations = migration.UpgradeOperations.Concat(migration.DowngradeOperations);

            foreach (var ns in GetNamespaces(operations).OrderBy(n => n).Distinct())
            {
                stringBuilder
                .Append("using ")
                .Append(ns)
                .AppendLine(";");
            }

            stringBuilder
            .AppendLine()
            .Append("namespace ")
            .AppendLine(@namespace)
            .AppendLine("{");

            using (stringBuilder.Indent())
            {
                stringBuilder
                .Append("public partial class ")
                .Append(className)
                .AppendLine(" : Migration")
                .AppendLine("{");

                using (stringBuilder.Indent())
                {
                    GenerateMigrationMethod("Up", migration.UpgradeOperations, stringBuilder);

                    stringBuilder.AppendLine().AppendLine();

                    GenerateMigrationMethod("Down", migration.DowngradeOperations, stringBuilder);
                }

                stringBuilder
                .AppendLine()
                .Append("}");
            }

            stringBuilder
            .AppendLine()
            .Append("}");
        }
        public virtual void ScaffoldMigration([NotNull] IMigrationMetadata migration)
        {
            Check.NotNull(migration, "migration");

            var className             = GetClassName(migration);
            var stringBuilder         = new IndentedStringBuilder();
            var metadataStringBuilder = new IndentedStringBuilder();

            MigrationCodeGenerator.GenerateMigrationClass(Namespace, className, migration, stringBuilder);
            MigrationCodeGenerator.GenerateMigrationMetadataClass(Namespace, className, migration, metadataStringBuilder);

            OnMigrationScaffolded(className, stringBuilder.ToString(), metadataStringBuilder.ToString());
        }
 public MigrationWithMetaDataAdapter(IMigration migration, IMigrationMetadata metadata)
 {
     if (migration == null)
     {
         throw new ArgumentNullException("migration");
     }
     if (metadata == null)
     {
         throw new ArgumentNullException("metadata");
     }
     Migration = migration;
     MetaData  = metadata;
 }
Пример #20
0
        protected virtual void ScaffoldMigration(
            [NotNull] IMigrationMetadata migration,
            [NotNull] IndentedStringBuilder migrationCode,
            [NotNull] IndentedStringBuilder migrationMetadataCode)
        {
            Check.NotNull(migration, "migration");
            Check.NotNull(migrationCode, "migrationCode");
            Check.NotNull(migrationMetadataCode, "migrationMetadataCode");

            var className = GetClassName(migration);

            MigrationCodeGenerator.GenerateMigrationClass(MigrationNamespace, className, migration, migrationCode);
            MigrationCodeGenerator.GenerateMigrationMetadataClass(MigrationNamespace, className, migration, migrationMetadataCode);
        }
Пример #21
0
        private string GetMigrationName(IMigration migration)
        {
            if (migration == null)
            {
                throw new ArgumentNullException("migration");
            }

            IMigrationMetadata metadata = migration as IMigrationMetadata;

            if (metadata != null)
            {
                return(string.Format("{0}: {1}", metadata.Version, metadata.Type.Name));
            }
            return(migration.GetType().Name);
        }
Пример #22
0
        public void Update(IMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor)
        {
            Debug.Assert(!(metadata is BootstrapMetadata));

            if (direction == MigrationDirection.Up)
            {
                _history.Insert(metadata.Timestamp, metadata.ModuleName, metadata.Tag);
            }
            else
            {
                Debug.Assert(direction == MigrationDirection.Down);
                Debug.Assert(_history.Contains(metadata.Timestamp, metadata.ModuleName), "Only migrations that were applied previously are being undone.");
                _history.Delete(metadata.Timestamp, metadata.ModuleName);
            }

            StoreChanges(connection, transaction, commandExecutor);
        }
Пример #23
0
        protected virtual IReadOnlyList <IMigrationMetadata> GetDatabaseMigrations(out bool historyRepositoryExists)
        {
            IReadOnlyList <IMigrationMetadata> migrations;

            try
            {
                migrations = HistoryRepository.Migrations;
                historyRepositoryExists = true;
            }
            catch (DataStoreException)
            {
                // TODO: Log the exception message.
                migrations = new IMigrationMetadata[0];
                historyRepositoryExists = false;
            }

            return(migrations);
        }
Пример #24
0
        public void Get_database_migrations()
        {
            var databaseMigrations
                = new IMigrationMetadata[]
                {
                new MigrationMetadata("000000000000001_Migration1"),
                new MigrationMetadata("000000000000002_Migration2")
                };

            var migrator   = MockMigrator(databaseMigrations, new IMigrationMetadata[0]);
            var migrations = migrator.GetDatabaseMigrations();

            Assert.Equal(databaseMigrations.Length, migrations.Count);

            for (var i = 0; i < databaseMigrations.Length; i++)
            {
                Assert.Equal(databaseMigrations[i], migrations[i]);
            }
        }
Пример #25
0
        public void Get_local_migrations()
        {
            var localMigrations
                = new IMigrationMetadata[]
                    {
                        new MigrationMetadata("000000000000001_Migration1"),
                        new MigrationMetadata("000000000000002_Migration2")
                    };

            var migrator = MockMigrator(new IMigrationMetadata[0], localMigrations);
            var migrations = migrator.GetLocalMigrations();

            Assert.Equal(localMigrations.Length, migrations.Count);

            for (var i = 0; i < localMigrations.Length; i++)
            {
                Assert.Equal(localMigrations[i], migrations[i]);
            }
        }
Пример #26
0
        public void Get_local_migrations()
        {
            var localMigrations
                = new IMigrationMetadata[]
                {
                new MigrationMetadata("000000000000001_Migration1"),
                new MigrationMetadata("000000000000002_Migration2")
                };

            var migrator   = MockMigrator(new IMigrationMetadata[0], localMigrations);
            var migrations = migrator.GetLocalMigrations();

            Assert.Equal(localMigrations.Length, migrations.Count);

            for (var i = 0; i < localMigrations.Length; i++)
            {
                Assert.Equal(localMigrations[i], migrations[i]);
            }
        }
Пример #27
0
        private void Process(MigrationMetadataChangedExpression expression)
        {
            if (CustomMigrationProcessor == null || expression == null)
            {
                return;
            }

            if (MigrationMetadata.Equals(expression.MigrationMetadata))
            {
                return;
            }

            RunCustomAction(() =>
            {
                MigrationMetadata = expression.MigrationMetadata;

                CustomMigrationProcessor.MigrationMetadataChanged(MigrationMetadata, this);
            });
        }
Пример #28
0
        public void Get_database_migrations()
        {
            var databaseMigrations
                = new IMigrationMetadata[]
                    {
                        new MigrationMetadata("000000000000001_Migration1"),
                        new MigrationMetadata("000000000000002_Migration2")
                    };

            var migrator = MockMigrator(databaseMigrations, new IMigrationMetadata[0]);
            var migrations = migrator.GetDatabaseMigrations();

            Assert.Equal(databaseMigrations.Length, migrations.Count);

            for (var i = 0; i < databaseMigrations.Length; i++)
            {
                Assert.Equal(databaseMigrations[i], migrations[i]);
            }
        }
        public virtual IReadOnlyList <SqlStatement> GenerateDeleteMigrationSql(
            [NotNull] IMigrationMetadata migration, [NotNull] SqlGenerator sqlGenerator)
        {
            Check.NotNull(migration, "migration");
            Check.NotNull(sqlGenerator, "sqlGenerator");

            // TODO: Figure out what needs to be done to fully generate the DELETE statement
            // below using the DML SQL generator.

            var stringBuilder = new StringBuilder();

            stringBuilder
            .Append("DELETE FROM ")
            .Append(sqlGenerator.DelimitIdentifier(TableName))
            .Append(" WHERE ")
            .Append(sqlGenerator.DelimitIdentifier("MigrationName"))
            .Append(" = ")
            .Append(sqlGenerator.GenerateLiteral(migration.Name));

            return(new[] { new SqlStatement(stringBuilder.ToString()) });
        }
Пример #30
0
        public static string GetMigrationName([NotNull] this IMigrationMetadata metadata)
        {
            Check.NotNull(metadata, "metadata");

            return(metadata.MigrationId.Substring(TimestampFormat.Length + 1));
        }
Пример #31
0
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 public MigrationEventArgs(IMigrationMetadata metadata, MigrationDirection direction)
 {
     _metadata = metadata;
     _direction = direction;
 }
Пример #32
0
 public ImportedMigration(IMigration implementation, IMigrationMetadata metadata)
 {
     _implementation = implementation;
     _metadata       = metadata;
 }
        // В версии 2 не было поддержки миграций (исправляем только для SQL Server и SQL Server CE).
        private static void FixDatabase(IConnectionSettings connectionSettings, IMigrationMetadata migrationMetadata)
        {
            DbConnection  connection  = null;
            DbTransaction transaction = null;

            try
            {
                switch (connectionSettings.ProviderInvariantName)
                {
                case DataConfiguration.SqlServerProviderInvariantName:
                    connection = new SqlConnection(connectionSettings.ConnectionString);
                    break;

                case DataConfiguration.SqlServerCompactProviderInvariantName:
                    connection = new SqlCeConnection(connectionSettings.ConnectionString);
                    break;

                default:
                    return;
                }

                try
                {
                    connection.Open();
                }
                catch (DbException exception)
                {
                    Logger.Error(exception.Message, exception);

                    return; // Ожидаем что база данных не существует.
                }

                string migrationId;

                using (var command = connection.CreateCommand())
                {
                    command.CommandText = "SELECT MigrationId FROM __MigrationHistory ORDER BY MigrationId";

                    DbDataReader dataReader = null;

                    try
                    {
                        dataReader = command.ExecuteReader();

                        if (!dataReader.Read())
                        {
                            throw new InvalidOperationException("!dataReader.Read()");
                        }

                        migrationId = (string)dataReader["MigrationId"];

                        if (migrationId.Equals(migrationMetadata.Id))
                        {
                            return;
                        }

                        if (dataReader.NextResult())
                        {
                            throw new InvalidOperationException("reader.NextResult()");
                        }
                    }
                    catch (DbException exception)
                    {
                        Logger.Error(exception.Message, exception); // Ожидаем что таблицы не существует.
                        return;
                    }
                    finally
                    {
                        if (null != dataReader)
                        {
                            dataReader.Close();
                            dataReader.Dispose();
                        }
                    }
                }

                if (!migrationId.EndsWith("_InitialCreate", StringComparison.OrdinalIgnoreCase))
                {
                    throw new InvalidOperationException("migrationId == " + migrationId);
                }

                transaction = connection.BeginTransaction();

                using (var command = connection.CreateCommand())
                {
                    command.Transaction = transaction;

                    command.CommandText = "DELETE FROM __MigrationHistory WHERE MigrationId = @MigrationId";
                    AddParameterTo(command, "MigrationId", migrationId);
                    command.ExecuteNonQuery();
                }

                using (var command = connection.CreateCommand())
                {
                    command.Transaction = transaction;

                    command.CommandText =
                        "INSERT INTO __MigrationHistory (MigrationId, ContextKey, Model, ProductVersion) VALUES (@MigrationId, @ContextKey, @Model, @ProductVersion)";

                    AddParameterTo(command, "MigrationId", migrationMetadata.Id);
                    AddParameterTo(command, "ContextKey", $"{typeof(Configuration).Namespace}.{nameof(Configuration)}");
                    AddParameterTo(command, "Model", Convert.FromBase64String(migrationMetadata.Target));
                    AddParameterTo(command, "ProductVersion", "6.1.3-40302");

                    command.ExecuteNonQuery();
                }

                transaction.Commit();
            }
            catch (Exception exception)
            {
                Logger.Error(exception.Message, exception);
                transaction?.Rollback();

                throw;
            }
            finally
            {
                if (null != connection)
                {
                    connection.Close();
                    connection.Dispose();
                }
            }
        }
Пример #34
0
 public void Update(IMigrationMetadata metadata, IDbConnection connection, IDbTransaction transaction, MigrationDirection direction, IDbCommandExecutor commandExecutor)
 {
     PersistedVersioning versioning = GetPersistedVersioning(connection, transaction, commandExecutor);
     versioning.Update(metadata, connection, transaction, direction, commandExecutor);
 }
Пример #35
0
 public bool IsContained(IMigrationMetadata metadata)
 {
     return _history.Contains(metadata.Timestamp, metadata.ModuleName);
 }
Пример #36
0
 public ImportedMigration(IMigration implementation, IMigrationMetadata metadata)
 {
     _implementation = implementation;
     _metadata = metadata;
 }
Пример #37
0
 private bool IsApplicable(IMigrationMetadata migration)
 {
     var comparer = new MigrationMetadataComparer();
     return _applicableMigrations.Select(m => m.Migration.Metadata).Contains(migration, comparer);
 }
 private static string GetMigrationDescription(IMigrationMetadata m)
 {
     string moduleName = (string.IsNullOrEmpty(m.ModuleName) ? MigrationExportAttribute.DefaultModuleName : m.ModuleName);
     return moduleName + ": " + m.Timestamp;
 }
Пример #39
0
        protected virtual IReadOnlyList<IMigrationMetadata> GetDatabaseMigrations(out bool historyRepositoryExists)
        {
            IReadOnlyList<IMigrationMetadata> migrations;
            try
            {
                migrations = HistoryRepository.Migrations;
                historyRepositoryExists = true;
            }
            catch (DbException)
            {
                // TODO: Log the exception message.
                migrations = new IMigrationMetadata[0];
                historyRepositoryExists = false;
            }

            return migrations;
        }
Пример #40
0
 public ImportedMigration(IMigration implementation, IMigrationMetadata metadata, bool useModuleNameAsDefaultSchema)
 {
     _implementation = implementation;
     _metadata = metadata;
     _useModuleNameAsDefaultSchema = useModuleNameAsDefaultSchema;
 }
        public override void GenerateMigrationMetadataClass(
            string @namespace,
            string className,
            IMigrationMetadata migration,
            IndentedStringBuilder stringBuilder)
        {
            Check.NotEmpty(@namespace, "namespace");
            Check.NotEmpty(className, "className");
            Check.NotNull(migration, "migration");
            Check.NotNull(stringBuilder, "stringBuilder");

            foreach (var ns in GetMetadataNamespaces(migration).OrderBy(n => n).Distinct())
            {
                stringBuilder
                .Append("using ")
                .Append(ns)
                .AppendLine(";");
            }

            stringBuilder
            .AppendLine()
            .Append("namespace ")
            .AppendLine(@namespace)
            .AppendLine("{");

            using (stringBuilder.Indent())
            {
                stringBuilder
                .Append("[ContextType(typeof(")
                .Append(migration.ContextType.GetNestedName())
                .AppendLine("))]")
                .Append("public partial class ")
                .Append(className)
                .AppendLine(" : IMigrationMetadata")
                .AppendLine("{");

                using (stringBuilder.Indent())
                {
                    GenerateMigrationProperty(
                        "string IMigrationMetadata.MigrationId",
                        () => stringBuilder
                        .Append("return ")
                        .Append(GenerateLiteral(migration.MigrationId))
                        .Append(";"),
                        stringBuilder);

                    stringBuilder.AppendLine().AppendLine();

                    GenerateMigrationProperty(
                        "IModel IMigrationMetadata.TargetModel",
                        () => ModelCodeGenerator.Generate(migration.TargetModel, stringBuilder),
                        stringBuilder);
                }

                stringBuilder
                .AppendLine()
                .Append("}");
            }

            stringBuilder
            .AppendLine()
            .Append("}");
        }
        private static string GetMigrationDescription(IMigrationMetadata m)
        {
            string moduleName = (string.IsNullOrEmpty(m.ModuleName) ? MigrationExportAttribute.DefaultModuleName : m.ModuleName);

            return(moduleName + ": " + m.Timestamp);
        }
Пример #43
0
            public Aggregation(ImportedAggregateMigration migration, List<IMigrationMetadata> aggregatedMigrations)
            {
                Debug.Assert(aggregatedMigrations.All(m => m.ModuleName == migration.Metadata.ModuleName), "All migrations within an aggregation must belong to the same module.");

                _migration = migration;
                _aggregatedMigrations = aggregatedMigrations;
                _lastAggregatedMigration = aggregatedMigrations.Last();
            }
Пример #44
0
 public void Setup()
 {
     migration         = new Mock <IMigration>(MockBehavior.Strict).Object;
     migrationMetadata = new Mock <IMigrationMetadata>(MockBehavior.Strict).Object;
     adapter           = new MigrationWithMetaDataAdapter(migration, migrationMetadata);
 }
Пример #45
0
 public MigrationPair(
     IMigrationMetadata localMigration,
     IMigrationMetadata databaseMigration)
 {
     LocalMigration = localMigration;
     DatabaseMigration = databaseMigration;
 }
 /// <summary>
 /// Constructor initialized <paramref name="migrationMetadata"/> to <see cref="MigrationMetadata"/>
 /// </summary>
 /// <param name="migrationMetadata"></param>
 public MigrationMetadataChangedExpression(IMigrationMetadata migrationMetadata)
 {
     Operation         = (connection, transaction) => { };
     MigrationMetadata = migrationMetadata;
 }