示例#1
0
        private IEnumerable <Func <IReadOnlyList <MigrationCommand> > > GetMigrationCommandLists(
            IReadOnlyList <HistoryRow> appliedMigrationEntries,
            string targetMigration = null)
        {
            IReadOnlyList <Migration> migrationsToApply, migrationsToRevert;

            PopulateMigrations(
                appliedMigrationEntries.Select(t => t.MigrationId),
                targetMigration,
                out migrationsToApply,
                out migrationsToRevert);

            for (var i = 0; i < migrationsToRevert.Count; i++)
            {
                var migration = migrationsToRevert[i];

                var index = i;
                yield return(() =>
                {
                    _logger.LogInformation(
                        RelationalEventId.RevertingMigration,
                        () => RelationalStrings.RevertingMigration(migration.GetId()));

                    return GenerateDownSql(
                        migration,
                        index != migrationsToRevert.Count - 1
                                ? migrationsToRevert[index + 1]
                                : null);
                });
            }

            foreach (var migration in migrationsToApply)
            {
                yield return(() =>
                {
                    _logger.LogInformation(
                        RelationalEventId.ApplyingMigration,
                        () => RelationalStrings.ApplyingMigration(migration.GetId()));

                    return GenerateUpSql(migration);
                });
            }
        }
示例#2
0
        private IEnumerable <Func <IReadOnlyList <IRelationalCommand> > > GetMigrationCommands(
            IReadOnlyList <HistoryRow> appliedMigrationEntries,
            string targetMigration = null)
        {
            var appliedMigrations   = new Dictionary <string, TypeInfo>();
            var unappliedMigrations = new Dictionary <string, TypeInfo>();

            foreach (var migration in _migrationsAssembly.Migrations)
            {
                if (appliedMigrationEntries.Any(
                        e => string.Equals(e.MigrationId, migration.Key, StringComparison.OrdinalIgnoreCase)))
                {
                    appliedMigrations.Add(migration.Key, migration.Value);
                }
                else
                {
                    unappliedMigrations.Add(migration.Key, migration.Value);
                }
            }

            IReadOnlyList <Migration> migrationsToApply;
            IReadOnlyList <Migration> migrationsToRevert;

            if (string.IsNullOrEmpty(targetMigration))
            {
                migrationsToApply = unappliedMigrations
                                    .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider))
                                    .ToList();
                migrationsToRevert = new Migration[0];
            }
            else if (targetMigration == Migration.InitialDatabase)
            {
                migrationsToApply  = new Migration[0];
                migrationsToRevert = appliedMigrations
                                     .OrderByDescending(m => m.Key)
                                     .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider))
                                     .ToList();
            }
            else
            {
                targetMigration   = _migrationsAssembly.GetMigrationId(targetMigration);
                migrationsToApply = unappliedMigrations
                                    .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) <= 0)
                                    .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider))
                                    .ToList();
                migrationsToRevert = appliedMigrations
                                     .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) > 0)
                                     .OrderByDescending(m => m.Key)
                                     .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider))
                                     .ToList();
            }

            for (var i = 0; i < migrationsToRevert.Count; i++)
            {
                var migration = migrationsToRevert[i];

                yield return(() =>
                {
                    _logger.LogInformation(RelationalStrings.RevertingMigration(migration.GetId()));

                    return GenerateDownSql(
                        migration,
                        i != migrationsToRevert.Count - 1
                                ? migrationsToRevert[i + 1]
                                : null);
                });
            }

            foreach (var migration in migrationsToApply)
            {
                yield return(() =>
                {
                    _logger.LogInformation(RelationalStrings.ApplyingMigration(migration.GetId()));

                    return GenerateUpSql(migration);
                });
            }
        }