Как удалить последнюю миграцию EFCore, если поставщик SQLite не может удалить столбцы - PullRequest
1 голос
/ 08 мая 2020

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

"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, если это можно сделать таким образом.

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

1 Ответ

1 голос
/ 08 мая 2020

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

Короче говоря, мне пришлось

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

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

...