Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
В этом руководстве вы начнете использовать EF Core функцию миграции для управления изменениями модели данных. В последующих руководствах вы добавите дополнительные миграции при изменении модели данных.
Изучив это руководство, вы:
- Узнайте о миграциях
- Создание начальной миграции
- Проанализируйте методы Up и Down
- Узнать о моментальном снимке модели данных
- Примените миграцию
Prerequisites
About migrations
При разработке нового приложения ваша модель данных часто меняется, и при каждом таком изменении она нарушает синхронизацию с базой данных. Вы начали эти учебные пособия с настройки Entity Framework для создания базы данных, если она не существует. Затем при каждом изменении модели данных — добавление, удаление или изменение классов сущностей, а также изменение класса DbContext — вы можете удалить базу данных, и EF создаёт новую, соответствующую модели, и заполняет её тестовыми данными.
Этот способ для обеспечения синхронизации базы данных с моделью данных хорошо работает до развертывания приложения в рабочей среде. Когда приложение работает в рабочей среде, обычно сохраняет данные, которые вы хотите сохранить, и вы не хотите терять все при каждом внесении изменений, таких как добавление нового столбца. Функция EF Core миграции решает эту проблему, позволяя EF обновить схему базы данных вместо создания новой базы данных.
Для работы с миграцией можно использовать консоль диспетчера пакетов (PMC) или ИНТЕРФЕЙС командной строки. В этих руководствах показано, как использовать команды CLI. Сведения о PMC приведены в конце этого руководства.
Удаление базы данных
Установите EF Core средства в качестве глобального средства и удалите базу данных:
dotnet tool install --global dotnet-ef
dotnet ef database drop
Note
По умолчанию архитектура двоичных файлов .NET для установки представляет архитектуру операционной системы. Чтобы указать другую архитектуру ОС, см. dotnet tool install --arch. Дополнительные сведения см. в статье о проблеме GitHub dotnet/AspNetCore.Docs #29262.
В следующем разделе объясняется, как выполнять команды CLI.
Создание начальной миграции
Сохраните изменения и создайте проект. Затем откройте командное окно и перейдите в папку проекта. Вот быстрый способ сделать это:
В обозревателе решений щелкните проект правой кнопкой мыши и выберите команду "Открыть папку" в проводнике в контекстном меню.
Введите "cmd" в адресной строке и нажмите клавишу ВВОД.
Введите следующую команду в командном окне:
dotnet ef migrations add InitialCreate
В предыдущих командах отображаются выходные данные, аналогичные следующим:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'
Если отображается сообщение об ошибке "не удается получить доступ к файлу ... ContosoUniversity.dll, так как он используется другим процессом.", найдите значок IIS Express в области уведомлений Windows, щелкните его правой кнопкой мыши, затем нажмите ContosoUniversity > Остановить сайт.
Изучите методы Up и Down
При выполнении migrations add команды EF создал код, который создаст базу данных с нуля. Этот код находится в папке Migrations в файле с именем <timestamp>_InitialCreate.cs. Метод UpInitialCreate класса создает таблицы базы данных, соответствующие наборам сущностей модели данных, и Down метод удаляет их, как показано в следующем примере.
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Course",
columns: table => new
{
CourseID = table.Column<int>(nullable: false),
Credits = table.Column<int>(nullable: false),
Title = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Course", x => x.CourseID);
});
// Additional code not shown
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Enrollment");
// Additional code not shown
}
}
Функция миграций вызывает метод Up, чтобы реализовать изменения модели данных для миграции. При вводе команды для отката обновления функция миграций вызывает метод Down.
Этот код предназначен для первоначальной миграции, созданной, когда вы ввели команду migrations add InitialCreate. Параметр имени миграции ("InitialCreate" в этом примере) используется для имени файла и может быть любым, каким вам хочется. Лучше всего выбрать слово или фразу, которая суммирует то, что делается в миграции. Например, последнюю миграцию можно назвать "AddDepartmentTable".
Если вы создали первоначальную миграцию, когда база данных уже существовала, код для создания базы данных формируется, но выполнять его не требуется, так как база данных уже соответствует модели данных. Однако при развертывании приложения в другой среде, где база данных еще не существует, этот код будет выполняться для создания базы данных, поэтому рекомендуется сначала его протестировать. Именно поэтому вы удаляли базу данных ранее, чтобы миграции могли создавать новую с нуля.
Моментальный снимок модели данных
Миграции создают моментальный снимок текущей схемы базы данных Migrations/SchoolContextModelSnapshot.cs. При добавлении миграции EF определяет, что изменилось, путем сравнения модели данных с файлом снимка.
Чтобы удалить миграцию, используйте команду dotnet ef migrations remove.
dotnet ef migrations remove удаляет миграцию и обеспечивает правильный сброс моментального снимка. Если dotnet ef migrations remove не удалось, используйте dotnet ef migrations remove -v для получения дополнительной информации о сбое.
Дополнительные сведения об использовании файла моментального снимка см. в разделе EF Core Миграции в командных средах.
Примените миграцию
В командном окне введите следующую команду, чтобы создать базу данных и таблицы в ней.
dotnet ef database update
Выходные данные команды похожи на команду migrations add, за исключением того, что вы видите журналы SQL-команд, которые настраивают базу данных. Большинство логов пропущены в следующих результатах выполнения. Если вы предпочитаете не видеть этот уровень детализации в сообщениях журнала, вы можете изменить уровень журнала в appsettings.Development.json файле. Дополнительные сведения см. в разделе "Ведение журнала" в .NET и ASP.NET Core.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
<logs omitted for brevity>
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.
Используйте обозреватель объектов SQL Server для проверки базы данных, как и в первом руководстве. Вы заметите добавление таблицы __EFMigrationsHistory, которая отслеживает, какие миграции были применены к базе данных. Просмотрите данные в этой таблице, и вы увидите одну строку для первой миграции. (Последний журнал в предыдущем примере выходных данных CLI показывает инструкцию INSERT, которая создает эту строку.)
Запустите приложение, чтобы убедиться, что все все еще работает так же, как и раньше.
Сравнение CLI и PMC
Средства EF для управления миграцией доступны из команд .NET CLI или командлетов PowerShell в окне консоли диспетчера пакетов Visual Studio (PMC). В этом руководстве показано, как использовать интерфейс командной строки, но при желании можно использовать PMC.
Команды EF для команд PMC находятся в пакете Microsoft.EntityFrameworkCore.Tools . Этот пакет включен в метапакет Microsoft.AspNetCore.App, поэтому вам не нужно добавлять ссылку на пакет, если у вашего приложения есть ссылка на пакет.Microsoft.AspNetCore.App
Важно: Это не тот же пакет, что и тот, который вы устанавливаете для интерфейса командной строки, изменяя файл .csproj. Имя этого элемента заканчивается на Tools, в отличие от имени пакета CLI, которое заканчивается на Tools.DotNet.
Дополнительные сведения о командах CLI см. в .NET CLI.
Дополнительные сведения о командах PMC см. в консоли диспетчера пакетов (Visual Studio).
Получение кода
Скачайте или ознакомьтесь с готовым приложением.
Next step
Перейдите к следующему руководству, чтобы начать изучение более сложных разделов о расширении модели данных. На этом пути вы создадите и примените дополнительные миграции.