Как удалить таблицы EF Core? Или как убрать все миграции? Или как вызвать `dotnet ef database update 0` из кода пользователя? - PullRequest
0 голосов
/ 28 августа 2018

Я занимаюсь разработкой веб-приложения и рядом с ним небольшого приложения для командной строки, которое устанавливает основные таблицы в БД. Последний можно сделать, позвонив dbContext.Database.Migrate();, и это работает.

Теперь я хочу предоставить опцию unistall (с этим приложением).

Но как убрать миграцию (означает вызвать функциональность dotnet ef database update 0 из моего кода)?

Это может быть не один командный вызов (как это было в случае с dbContext.Database.Migrate();). Но фрагмент с циклом через все миграции в сборке миграций и вызовом 'Downs'.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

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

dbContext.GetService<IMigrator>().Migrate(targetMigration);

Используйте константу Migration.InitialDatabase, чтобы отменить все миграции.

Migration.InitialDatabase

  • Пространство имен: Microsoft.EntityFrameworkCore.Migrations
  • Сборка: Microsoft.EntityFrameworkCore.Relational.dll
  • Описание: Идентификатор миграции для пустой базы данных.
  • Декларация: public const string InitialDatabase;

Ссылка: https://github.com/aspnet/EntityFrameworkCore/issues/9968#issuecomment-335295576

0 голосов
/ 02 сентября 2018

EF Core предоставляет публично только метод расширения dbContext.Database.Migrate();, используемый для переноса последней версии. Это упомянуто в разделе Применение миграций во время выполнения документации EF Core, которая также содержит следующий

Примечание

Этот метод основан на сервисе IMigrator, который можно использовать для более сложных сценариев. Используйте DbContext.GetService<IMigrator>() для доступа к нему.

, который дает вам решение, потому что интерфейс IMigrator предоставляет метод Migrate, принимающий необязательный параметр targetMigration с той же семантикой, что и команды dotnet ef database update или Update-Database PM. Передача "0" (которая является значением константы Migration.InitialDatabase) будет выполнять соответствующую операцию.

Вам понадобятся следующие дополнительные using s:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;

и такой код:

var migrator = dbContext.GetService<IMigrator>();
migrator.Migrate(Migration.InitialDatabase);
...