Управление миграциями
По мере изменения модели миграции добавляются и удаляются в рамках нормальной разработки, а файлы миграции проверка в управление версиями проекта. Чтобы управлять миграцией, необходимо сначала установить средства командной строки EF Core.
Совет
Если DbContext
находится не в той же сборке, что и начальный проект, можно явным образом указать целевой и начальный проекты в средствах консоли диспетчера пакетов или в средствах .NET Core CLI.
Добавление миграции
После изменения модели можно добавить миграцию для этого изменения:
dotnet ef migrations add AddBlogCreatedTimestamp
Имя миграции можно использовать как сообщение фиксации в системе управления версиями. Например, можно выбрать имя, например AddBlogCreatedTimestamp , если изменение является новым CreatedTimestamp
свойством в сущности Blog
.
В каталог Migrations проекта добавляются три файла.
- XXXXXXXXXXXXXX_AddCreatedTimestamp.cs-Основной файл миграции. Содержит операции, необходимые для применения миграции (в
Up
) и ее отмены (вDown
). - XXXXXXXXXXXXXX_AddCreatedTimestamp.Designer.cs-Файл метаданных миграции. Содержит сведения, используемые EF.
- MyContextModelSnapshot.cs — моментальный снимок текущей модели. Используется для определения появившихся изменений при добавлении следующей миграции.
Метка времени в именах файлов позволяет расположить их в хронологическом порядке, чтобы вы могли отслеживать ход изменений.
Пространства имен
Вы можете свободно перемещать файлы миграций и изменять их пространство имен вручную. Новые миграции создаются в виде элементов того же уровня, что и последняя миграция. Кроме того, можно указать каталог во время создания следующим образом:
dotnet ef migrations add InitialCreate --output-dir Your/Directory
Примечание.
Вы также можете изменить пространство имен независимо от каталога с помощью --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, во многих случаях это невозможно. Например, может потребоваться заменить существующие FirstName
и LastName
свойства одним новым 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. Его также можно использовать для обхода ошибок синтаксического анализа в сценариях идемпотентной миграции, которые могут возникать, когда ссылки на столбцы в настоящее время не существуют в таблице.
Это можно использовать для управления любым аспектом базы данных, включая:
- Хранимые процедуры
- Компонент Full-text Search
- Функции
- Триггеры
- Представления
В большинстве случаев EF Core автоматически упаковывает каждую миграцию в свою собственную транзакцию при применении миграций. К сожалению, некоторые операции миграции не могут выполняться в рамках транзакции в некоторых базах данных; в этих случаях вы можете отказаться от транзакции, передав в suppressTransaction: true
migrationBuilder.Sql
.
Удаление миграции
Иногда, добавив миграцию, вы понимаем, что нужно внести дополнительные изменения в модель EF Core перед ее применением. Для удаления последней миграции используйте приведенную ниже команду.
dotnet ef migrations remove
Удалив миграцию, вы можете внести в модель дополнительные изменения и снова добавить ее.
Предупреждение
Избегайте удаления любых миграций, которые уже применены к рабочим базам данных. Это означает, что вы не сможете отменить изменения эти миграции из баз данных и могут нарушить предположения, сделанные последующими миграциями.
Перечисление миграций
Вы можете перечислить все существующие миграции следующим образом:
dotnet ef migrations list
Проверка ожидающих изменений модели
Примечание.
Эта функция была добавлена в EF Core 8.0.
Иногда может потребоваться проверка, если с момента последней миграции произошли какие-либо изменения модели. Это поможет вам узнать, когда вы или товарищ по команде забыли добавить миграцию. Один из способов сделать это с помощью этой команды.
dotnet ef migrations has-pending-model-changes
Этот проверка также можно выполнять программными средствамиcontext.Database.HasPendingModelChanges()
. Это можно использовать для записи модульного теста, который завершается сбоем при добавлении миграции.
Сброс всех миграций
В некоторых крайних случаях может потребоваться удалить все миграции и начать работу. Это можно легко сделать, удалив папку Migrations и удаляя базу данных. На этом этапе можно создать новую начальную миграцию, которая будет содержать всю текущую схему.
Можно также сбросить все миграции и создать одну, не теряя данные. Иногда это называется "скваширование", и включает в себя некоторые ручной работы:
- Создайте резервную копию базы данных, если что-то не так.
- В базе данных удалите все строки из таблицы журнала миграций (например
DELETE FROM [__EFMigrationsHistory]
, в SQL Server). - Удалите папку Migrations .
- Создайте новую миграцию и создайте скрипт SQL для него (
dotnet ef migrations script
). - Вставьте одну строку в журнал миграций, чтобы записать, что первая миграция уже применена, так как таблицы уже есть. Вставка SQL является последней операцией в скрипте SQL, созданном выше, и напоминает следующее (не забудьте обновить значения):
INSERT INTO [__EFMigrationsHistory] ([MIGRATIONID], [PRODUCTVERSION])
VALUES (N'<full_migration_timestamp_and_name>', N'<EF_version>');
Предупреждение
Любой пользовательский код миграции будет потерян при удалении папки Migrations . Любые настройки должны применяться к новой первоначальной миграции вручную, чтобы сохраниться.
Дополнительные ресурсы
- Справочник по инструментам Entity Framework Core: .NET Core CLI — включает команды для обновления, удаления, добавления, отмены изменений и т. д.
- Справочник по инструментам Entity Framework Core: консоль диспетчера пакетов в Visual Studio — включает команды для обновления, удаления, добавления, отмены изменений и т. д.