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))); }
/// <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; } } }
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))); }
/// <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); }