Как удалить последнюю миграцию EFCore, если поставщик SQLite не может удалить столбцы

Это простая база данных EFCore в приложении .NETCore 3.1 с тремя миграциями.

"init"      Initial migration
"gcalg500"  Added seeding data and tables
"valtt"     Added more seeding data and tables

Самый последний из них все еще проверяется в рабочем коде. Но после того, как я сделал это и запустил несколько раз, я понял, что хочу отменить это, внести больше изменений и применить снова. поэтому я попробовал remove-migration из консоли диспетчера пакетов. Возвращенная ошибка была

The migration '20200507181032_valtt' has already been applied to the database. Revert it
and try again. If the migration has been applied to other databases, consider reverting its
changes using a new migration.

Небольшой поиск здесь привел меня к эту ветку, в которой говорится, что решение состоит в том, чтобы update-database вернуться к предыдущей миграции, а затем затем удалить миграцию. Итак, я попробовал это, но, видимо, есть проблема с провайдером SQLite, который не позволяет мне это сделать. Вывод консоли диспетчера пакетов выглядит следующим образом:

PM> update-database gcalg500
Build started...
Build succeeded.
Reverting migration '20200507181032_valtt'.
System.NotSupportedException: SQLite does not support this migration operation ('DropColumnOperation'). For more information, see http://go.microsoft.com/fwlink/?LinkId=723262.
   at Microsoft.EntityFrameworkCore.Migrations.SqliteMigrationsSqlGenerator.Generate(DropColumnOperation operation, IModel model, MigrationCommandListBuilder builder, Boolean terminate)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.<>c.<.cctor>b__71_12(MigrationsSqlGenerator g, MigrationOperation o, IModel m, MigrationCommandListBuilder b)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(MigrationOperation operation, IModel model, MigrationCommandListBuilder builder)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.SqliteMigrationsSqlGenerator.Generate(IReadOnlyList`1 operations, IModel model)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.GenerateDownSql(Migration migration, Migration previousMigration)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.<>c__DisplayClass15_1.<GetMigrationCommandLists>b__1()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
SQLite does not support this migration operation ('DropColumnOperation'). For more information, see http://go.microsoft.com/fwlink/?LinkId=723262.

Хорошо, поэтому я не могу использовать этот подход. Итак, что мне делать? Есть ли какой-нибудь ручной способ исправить это? У меня есть расширение SQLite Compact Toolbox, поэтому я могу напрямую редактировать базу данных SQLite, если это можно сделать таким образом.

(Я понимаю, что мог бы просто применить еще одну миграцию поверх той, которую я уже сделал, но я очень хотел бы избежать этого сценария по несвязанным причинам. Кроме того, это проблема, которая может возникнуть снова, поэтому, если есть способ сделать это, я хотел бы узнать его)


person Joe    schedule 08.05.2020    source источник


Ответы (1)


Отвечая на мой собственный вопрос, потому что я наткнулся на решение, которое сработало. Может быть, это поможет кому-то еще. Ссылка на ответ была на самом деле в самом тексте ошибки, который я опубликовал, поэтому я чувствую себя по праву глупым, потому что не нашел ее перед публикацией.

Короче, что я должен был сделать, это

  1. Откройте базу данных с помощью расширения Sqlite Toolkit.
  2. Используйте это расширение для создания сценария добавления проблемной таблицы (со столбцом, который необходимо удалить).
  3. Отредактируйте этот скрипт, чтобы просто удалить бит, добавляющий столбец, который мне больше не нужен.
  4. Переименуйте эту таблицу в другое имя.
  5. Запустите скрипт, чтобы повторно сгенерировать таблицу, как она была
  6. Скиньте переименованную версию.

На этом этапе я смог обновить базу данных до предыдущей версии, а затем удалить миграцию. Внес дополнительные изменения, которые я хотел, напрямую, а затем создал с ними новую миграцию. Кажется, работает хорошо

person Joe    schedule 08.05.2020