// TODO: DRY (file names) public virtual MigrationFiles RemoveMigration([NotNull] string projectDir, [NotNull] string rootNamespace) { Check.NotEmpty(projectDir, nameof(projectDir)); Check.NotEmpty(rootNamespace, nameof(rootNamespace)); var files = new MigrationFiles(); var modelSnapshot = _migrationAssembly.ModelSnapshot; if (modelSnapshot == null) { throw new InvalidOperationException(Strings.NoSnapshot); } var language = _migrationCodeGenerator.Language; IModel model = null; var migrations = _migrationAssembly.Migrations; if (migrations.Count != 0) { var migration = migrations.Last(); model = migration.Target; if (!_modelDiffer.HasDifferences(model, modelSnapshot.Model)) { if (_historyRepository.GetAppliedMigrations().Any( e => e.MigrationId.Equals(migration.Id, StringComparison.OrdinalIgnoreCase))) { throw new InvalidOperationException(Strings.UnapplyMigration(migration.Id)); } var migrationFileName = migration.Id + language; var migrationFile = TryGetProjectFile(projectDir, migrationFileName); if (migrationFile != null) { _logger.Value.LogInformation(Strings.RemovingMigration(migration.Id)); // TODO: Test version control. If broken, delete and write files in the commands File.Delete(migrationFile); files.MigrationFile = migrationFile; } else { _logger.Value.LogWarning(Strings.NoMigrationFile(migrationFileName, migration.GetType().FullName)); } var migrationMetadataFileName = migration.Id + ".Designer" + language; var migrationMetadataFile = TryGetProjectFile(projectDir, migrationMetadataFileName); if (migrationMetadataFile != null) { File.Delete(migrationMetadataFile); files.MigrationMetadataFile = migrationMetadataFile; } else { _logger.Value.LogVerbose(Strings.NoMigrationMetadataFile(migrationMetadataFileName)); } model = migrations.Count > 1 ? migrations[migrations.Count - 2].Target : null; } else { _logger.Value.LogVerbose(Strings.ManuallyDeleted); } } var modelSnapshotName = modelSnapshot.GetType().Name; var modelSnapshotFileName = modelSnapshotName + language; var modelSnapshotFile = TryGetProjectFile(projectDir, modelSnapshotFileName); if (model == null) { if (modelSnapshotFile != null) { _logger.Value.LogInformation(Strings.RemovingSnapshot); File.Delete(modelSnapshotFile); files.ModelSnapshotFile = modelSnapshotFile; } else { _logger.Value.LogWarning( Strings.NoSnapshotFile(modelSnapshotFileName, modelSnapshot.GetType().FullName)); } } else { var modelSnapshotNamespace = modelSnapshot.GetType().Namespace; var modelSnapshotCode = _migrationCodeGenerator.GenerateSnapshot( modelSnapshotNamespace, _contextType, modelSnapshotName, model); if (modelSnapshotFile == null) { modelSnapshotFile = Path.Combine( GetDirectory(projectDir, null, GetSubnamespace(rootNamespace, modelSnapshotNamespace)), modelSnapshotFileName); } _logger.Value.LogInformation(Strings.RevertingSnapshot); File.WriteAllText(modelSnapshotFile, modelSnapshotCode); } return(files); }
public virtual bool HasPendingModelChanges() => _modelDiffer.HasDifferences(_migrationAssembly.LastModel, _model);