public IEnumerable <VersionedMigration> GetMigrations(MigrationVersion after, MigrationVersion before)
        {
            if (!string.Equals(after.Collection, before.Collection))
            {
                throw new ArgumentException("Cannot apply cross collections migrations");
            }

            var migrations =
                (
                    from type in LocatedAssembly.GetTypes()
                    where typeof(IMigration).GetTypeInfo().IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract
                    let attribute = type.GetTypeInfo().GetCustomAttribute <MigrationAttribute>()
                                    where attribute != null &&
                                    (string.IsNullOrEmpty(after.Collection) || string.Equals(attribute.Collection, after.Collection)) &&
                                    after.Version < attribute.Version && attribute.Version <= before.Version
                                    select new { Migration = _factory.Create(type), Version = new MigrationVersion(attribute.Collection, attribute.Version, attribute.Description) }
                ).ToList();

            foreach (var m in migrations)
            {
                ((IDbMigration)m.Migration).UseDatabase(_database);
            }

            return(migrations.Select(x => new VersionedMigration(x.Migration, x.Version)));
        }
Exemple #2
0
        /// <summary>
        /// Apply all migrations before specified version for target collection.
        /// Use -1 as a version parameter to apply all existing migrations.
        /// </summary>
        /// <param name="collection">The target collection name.</param>
        /// <param name="version">The desired migration version.</param>
        public void Up(string collection, long version = -1)
        {
            version = version == -1 ? long.MaxValue : version;

            Console.WriteLine($"Discovering migrations in {_locator.LocatedAssembly.FullName}");

            var appliedMigrations      = _dbMigrations.GetAppliedMigrations(collection);
            var inapplicableMigrations =
                _locator.GetMigrations(MigrationVersion.Min(collection), new MigrationVersion(collection, version))
                .Where(m => appliedMigrations.All(x => x.Version != m.Version.Version || !string.Equals(x.Collection, m.Version.Collection)))
                .OrderBy(x => x.Version.Collection)
                .ThenBy(x => x.Version.Version)
                .ToList();

            Console.WriteLine($"Found ({inapplicableMigrations.Count}) migrations in {_locator.LocatedAssembly.FullName}");

            foreach (var migration in inapplicableMigrations)
            {
                Console.WriteLine($"Applying: {migration.Version}");

                migration.Up();
                _dbMigrations.ApplyMigration(migration.Version);

                Console.WriteLine($"Applied: {migration.Version}");
            }
        }
        /// <summary>
        /// Roll back all collection migrations after specified version.
        /// Use -1 as a version parameter to downgrade all existing migrations.
        /// </summary>
        /// <param name="collection">The target collection name.</param>
        /// <param name="version">The desired migration version.</param>
        public void Down(string collection, long version = -1)
        {
            //Console.WriteLine($"Discovering migrations in {_locator.LocatedAssembly.FullName}");

            var appliedMigrations    = _dbMigrations.GetAppliedMigrations(collection);
            var downgradedMigrations =
                _locator.GetMigrations(new MigrationVersion(collection, version), MigrationVersion.Max(collection))
                .Where(m => appliedMigrations.Any(x => x.Version == m.Version.Version && string.Equals(x.Collection, m.Version.Collection)))
                .OrderByDescending(x => x.Version.Collection)
                .ThenByDescending(x => x.Version.Version)
                .ToList();

            _logger?.LogInformation($"Found ({downgradedMigrations.Count}) migrations in {_locator.LocatedAssembly.FullName}");

            foreach (var migration in downgradedMigrations)
            {
                try
                {
                    migration.Down();
                    _dbMigrations.CancelMigration(migration.Version);
                    _logger?.LogInformation($"Applied down migration: {migration.Version.Version}  [{migration.Version.Description}].");
                }
                catch (Exception ex)
                {
                    _logger?.LogError(ex, $"Could not apply down migration {migration.Version.Version} [{migration.Version.Description}]!");
                    break;
                }
            }
        }
        /// <summary>
        /// Apply all migrations before specified version for target collection.
        /// Use -1 as a version parameter to apply all existing migrations.
        /// </summary>
        /// <param name="collection">The target collection name.</param>
        /// <param name="version">The desired migration version.</param>
        public void Up(string collection, long version = -1)
        {
            version = version == -1 ? long.MaxValue : version;

            //_logger.LogDebug($"Discovering migrations in {_locator.LocatedAssembly.FullName}");

            var appliedMigrations      = _dbMigrations.GetAppliedMigrations(collection);
            var inapplicableMigrations =
                _locator.GetMigrations(MigrationVersion.Min(collection), new MigrationVersion(collection, version))
                .Where(m => appliedMigrations.All(x => x.Version != m.Version.Version || !string.Equals(x.Collection, m.Version.Collection)))
                .OrderBy(x => x.Version.Collection)
                .ThenBy(x => x.Version.Version)
                .ToList();

            _logger?.LogInformation($"Found ({inapplicableMigrations.Count}) migrations in {_locator.LocatedAssembly.FullName}");

            foreach (var migration in inapplicableMigrations)
            {
                try
                {
                    migration.Up();
                    _dbMigrations.ApplyMigration(migration.Version);
                    _logger?.LogInformation($"Applied migration {migration.Version.Version} [{migration.Version.Description}].");
                }
                catch (Exception ex)
                {
                    _logger?.LogError(ex, $"Could not apply migration {migration.Version.Version} [{migration.Version.Description}]!");
                    break;
                }
            }
        }
Exemple #5
0
        public IEnumerable <VersionedMigration> GetMigrations(MigrationVersion after, MigrationVersion before)
        {
            var migrations =
                (
                    from type in _assembly.GetTypes()
                    where typeof(IMigration).GetTypeInfo().IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract
                    let attribute = type.GetTypeInfo().GetCustomAttribute <MigrationAttribute>()
                                    where attribute != null && after.Version < attribute.Version && attribute.Version <= before.Version
                                    orderby attribute.Version
                                    select new { Migration = (IMigration)Activator.CreateInstance(type), Version = new MigrationVersion(attribute.Version, attribute.Description) }
                ).ToList();

            foreach (var m in migrations)
            {
                ((IDbMigration)m.Migration).UseDatabase(_database);
            }

            return(migrations.Select(x => new VersionedMigration(x.Migration, x.Version)));
        }
Exemple #6
0
        /// <summary>
        /// Roll back all collection migrations after specified version.
        /// Use -1 as a version parameter to downgrade all existing migrations.
        /// </summary>
        /// <param name="collection">The target collection name.</param>
        /// <param name="version">The desired migration version.</param>
        public void Down(string collection, long version = -1)
        {
            Console.WriteLine($"Discovering migrations in {_locator.LocatedAssembly.FullName}");

            var appliedMigrations    = _dbMigrations.GetAppliedMigrations(collection);
            var downgradedMigrations =
                _locator.GetMigrations(new MigrationVersion(collection, version), MigrationVersion.Max(collection))
                .Where(m => appliedMigrations.Any(x => x.Version == m.Version.Version && string.Equals(x.Collection, m.Version.Collection)))
                .OrderByDescending(x => x.Version.Collection)
                .ThenByDescending(x => x.Version.Version)
                .ToList();

            Console.WriteLine($"Found ({downgradedMigrations.Count}) migrations in {_locator.LocatedAssembly.FullName}");

            foreach (var migration in downgradedMigrations)
            {
                Console.WriteLine($"Applying: {migration.Version}");

                migration.Down();
                _dbMigrations.CancelMigration(migration.Version);

                Console.WriteLine($"Applied: {migration.Version}");
            }
        }
 public void CancelMigration(MigrationVersion version)
 {
     _db.GetCollection <MigrationVersion>(_collectionName).DeleteOne(x => x.Version == version.Version && x.Collection == version.Collection);
 }
 public void ApplyMigration(MigrationVersion version)
 {
     _db.GetCollection <MigrationVersion>(_collectionName).InsertOne(version);
 }