Управление миграцией

При изменении модели миграция добавляется и удаляется в рамках обычной разработки, а файлы миграции возвращаются в систему управления версиями проекта. Для управления миграцией необходимо сначала установить EF Core программ командной строки.

Совет

если объект DbContext находится в сборке, отличной от сборки запускаемого проекта, можно явно указать целевой и запускаемый проекты в DbContext или .NET Core CLI.

Добавление миграции

После изменения модели можно добавить миграцию для этого изменения:

dotnet ef migrations add AddBlogCreatedTimestamp

Имя миграции можно использовать как сообщение фиксации в системе управления версиями. Например, можно выбрать имя, например аддблогкреатедтиместамп , если изменение является новым свойством Blog сущности.

В каталог Migrations проекта добавляются три файла.

  • XXXXXXXXXXXXXX_AddCreatedTimestamp. CS— основной файл миграции. Содержит операции, необходимые для применения миграции (в Up) и ее отмены (в Down).
  • XXXXXXXXXXXXXX_AddCreatedTimestamp. Designer. CS— файл метаданных миграции. Содержит сведения, используемые EF.
  • MyContextModelSnapshot.cs — моментальный снимок текущей модели. Используется для определения появившихся изменений при добавлении следующей миграции.

Метка времени в именах файлов позволяет расположить их в хронологическом порядке, чтобы вы могли отслеживать ход изменений.

Пространства имен

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

dotnet ef migrations add InitialCreate --output-dir Your/Directory

Примечание

В EF Core 5,0 можно также изменить пространство имен независимо от каталога с помощью --namespace .

Настройка кода миграции

Хотя EF Core обычно создает точную миграцию, следует всегда проверять код и убедиться, что он соответствует требуемому изменению. в некоторых случаях это даже необходимо сделать.

Переименование столбцов

Одним из важных примеров, где требуется настройка миграции, является переименование свойства. Например, если переименовать свойство из Name в FullName , EF Core создаст следующую миграцию:

migrationBuilder.DropColumn(
    name: "Name",
    table: "Customers");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customers",
    nullable: true);

EF Core, как правило, не может быть уверенным в том, что нужно удалить столбец и создать новый (два отдельных изменения) и когда столбец должен быть переименован. Если приведенная выше миграция применяется "как есть", все имена клиентов будут потеряны. Чтобы переименовать столбец, замените созданную выше миграцию следующей:

migrationBuilder.RenameColumn(
    name: "Name",
    table: "Customers",
    newName: "FullName");

Совет

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

Добавление необработанных SQL

В то время как переименование столбца может быть выполнено через встроенный API, во многих случаях это невозможно. Например, может потребоваться заменить существующие FirstNameLastName Свойства и одним новым FullName свойством. Процесс миграции, создаваемый EF Core, будет следующим:

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

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

migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

migrationBuilder.Sql(
@"
    UPDATE Customer
    SET FullName = FirstName + ' ' + LastName;
");

migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");

migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

Произвольные изменения через необработанные SQL

необработанные SQL также можно использовать для управления объектами базы данных, которые EF Core не знают о. Для этого добавьте миграцию, не внося изменения в модель. будет создана пустая миграция, которая затем может быть заполнена необработанными SQL операциями.

например, следующая миграция создает SQL Server хранимую процедуру:

migrationBuilder.Sql(
@"
    EXEC ('CREATE PROCEDURE getFullName
        @LastName nvarchar(50),
        @FirstName nvarchar(50)
    AS
        RETURN @LastName + @FirstName;')");

Совет

EXECиспользуется, когда инструкция должна быть первой или единственной в SQL пакете. Его также можно использовать для обхода ошибок синтаксического анализатора в сценариях миграции идемпотентными, которые могут возникать, если в таблице не существует столбцов, на которые имеются ссылки.

Это можно использовать для управления любым аспектом базы данных, в том числе:

  • Хранимые процедуры
  • Полнотекстовый поиск
  • Функции
  • Триггеры
  • Представления

В большинстве случаев EF Core будет автоматически переносить каждую миграцию в собственную транзакцию при применении миграции. К сожалению, некоторые операции миграции не могут быть выполнены внутри транзакции в некоторых базах данных. в таких случаях вы можете отказаться от транзакции, передав ее suppressTransaction: truemigrationBuilder.Sql .

Удаление миграции

Иногда, добавив миграцию, вы понимаем, что нужно внести дополнительные изменения в модель EF Core перед ее применением. Для удаления последней миграции используйте приведенную ниже команду.

Удалив миграцию, вы можете внести в модель дополнительные изменения и снова добавить ее.

Предупреждение

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

Перечисление миграций

Список всех существующих миграций можно просмотреть следующим образом:

dotnet ef migrations list

Сброс всех миграций

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

Кроме того, можно сбросить все миграции и создать одну из них без потери данных. Это иногда называется "использование параметра squash" и требует выполнения некоторых действий вручную:

  • Удаление папки миграций
  • создать новую миграцию и создать для нее скрипт SQL
  • В базе данных удалите все строки из таблицы журнала миграции.
  • Вставка одной строки в журнал миграции для записи того, что первая миграция уже применена, так как таблицы уже есть. SQL вставки — это последняя операция в скрипте SQL, созданном ранее.

Предупреждение

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

Дополнительные ресурсы