자습서: 마이그레이션 기능 사용 - ASP.NET MVC 및 EF Core 사용Tutorial: Using the migrations feature - ASP.NET MVC with EF Core

이 자습서에서는 데이터 모델 변경을 관리하기 위해 EF Core 마이그레이션 기능을 사용하기 시작합니다.In this tutorial, you start using the EF Core migrations feature for managing data model changes. 이후의 자습서에서는 데이터 모델을 변경하면서 더 많은 마이그레이션을 추가하게 됩니다.In later tutorials, you'll add more migrations as you change the data model.

이 자습서에서는 다음과 같은 작업을 수행합니다.In this tutorial, you:

  • 마이그레이션에 대해 알아보기Learn about migrations
  • 연결 문자열 변경Change the connection string
  • 초기 마이그레이션 만들기Create an initial migration
  • Up 및 Down 메서드 검사Examine Up and Down methods
  • 데이터 모델 스냅샷에 대해 알아보기Learn about the data model snapshot
  • 마이그레이션 적용Apply the migration

사전 요구 사항Prerequisites

마이그레이션 정보About migrations

새 애플리케이션을 개발하는 경우 데이터 모델은 자주 변경되며 모델이 변경될 때마다 데이터베이스와 동기화를 가져옵니다.When you develop a new application, your data model changes frequently, and each time the model changes, it gets out of sync with the database. 데이터베이스가 존재하지 않는 경우 Entity Framework를 구성하여 만들면서 이러한 자습서를 시작하였습니다.You started these tutorials by configuring the Entity Framework to create the database if it doesn't exist. 그런 다음, 엔터티 클래스를 추가, 제거 또는 변경하거나 DbContext 클래스를 변경하면서 데이터 모델을 변경할 때마다 데이터베이스를 삭제할 수 있습니다. 또한 EF는 모델에 일치하는 새로운 항목을 만들고 테스트 데이터로 시드합니다.Then each time you change the data model -- add, remove, or change entity classes or change your DbContext class -- you can delete the database and EF creates a new one that matches the model, and seeds it with test data.

데이터베이스를 데이터 모델과 동기화된 상태로 유지하는 이 메서드는 애플리케이션을 프로덕션 환경에 배포할 때까지 잘 작동합니다.This method of keeping the database in sync with the data model works well until you deploy the application to production. 애플리케이션이 프로덕션 환경에서 실행 중인 경우, 일반적으로 새 열을 추가하는 것처럼 사용자가 변경할 때마다 유지하려는 데이터 및 손실하지 않으려는 데이터를 저장합니다.When the application is running in production it's usually storing data that you want to keep, and you don't want to lose everything each time you make a change such as adding a new column. EF Core 마이그레이션 기능은 EF가 새 데이터베이스를 만드는 대신 데이터베이스 스키마를 업데이트하도록 설정하여 이 문제를 해결합니다.The EF Core Migrations feature solves this problem by enabling EF to update the database schema instead of creating a new database.

마이그레이션을 수행하기 위해 PMC(패키지 관리자 콘솔) 또는 CLI를 사용할 수 있습니다.To work with migrations, you can use the Package Manager Console (PMC) or the CLI. 이러한 자습서에는 CLI 명령을 사용하는 방법을 보여 줍니다.These tutorials show how to use CLI commands. PMC에 대한 정보는 이 자습서의 마지막에 나와 있습니다.Information about the PMC is at the end of this tutorial.

연결 문자열 변경Change the connection string

appsettings.json 파일에서 연결 문자열에 있는 데이터베이스의 이름을 ContosoUniversity2 또는 사용 중인 컴퓨터에서 사용한 적 없는 다른 이름으로 변경합니다.In the appsettings.json file, change the name of the database in the connection string to ContosoUniversity2 or some other name that you haven't used on the computer you're using.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

이러한 변경은 첫 번째 마이그레이션이 새 데이터베이스를 만드는 프로젝트를 설정합니다.This change sets up the project so that the first migration will create a new database. 이는 마이그레이션을 시작하는 데 필수는 아니지만 나중에 이에 대한 이점을 확인할 수 있습니다.This isn't required to get started with migrations, but you'll see later why it's a good idea.

참고

데이터베이스 이름을 변경하는 대신, 데이터베이스를 삭제할 수 있습니다.As an alternative to changing the database name, you can delete the database. SSOX(SQL Server 개체 탐색기) 또는 database drop CLI 명령을 사용합니다.Use SQL Server Object Explorer (SSOX) or the database drop CLI command:

dotnet ef database drop

다음 섹션에서는 CLI 명령을 실행하는 방법을 설명합니다.The following section explains how to run CLI commands.

초기 마이그레이션 만들기Create an initial migration

변경 내용을 저장하고 프로젝트를 빌드합니다.Save your changes and build the project. 그런 다음, 명령 창을 열고 프로젝트 폴더로 이동합니다.Then open a command window and navigate to the project folder. 작업을 수행하는 빠른 방법은 다음과 같습니다.Here's a quick way to do that:

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 파일 탐색기에서 폴더 열기를 선택합니다.In Solution Explorer, right-click the project and choose Open Folder in File Explorer from the context menu.

    파일 탐색기에서 열기 메뉴 항목

  • 주소 표시줄에 “cmd”를 입력하고 Enter 키를 누릅니다.Enter "cmd" in the address bar and press Enter.

    열기 명령 창

명령 창에서 다음 명령을 입력합니다.Enter the following command in the command window:

dotnet tool install --global dotnet-ef
dotnet ef migrations add InitialCreate

dotnet tool install --global dotnet-efdotnet ef전역 도구로 설치합니다.dotnet tool install --global dotnet-ef installs dotnet ef as a global tool.

위의 명령에서는 다음과 유사한 출력이 표시됩니다.In the preceding commands, output similar to the following is displayed:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.2.0-rtm-35687 initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

cannot access the file ... ContosoUniversity.dll because it is being used by another process. (다른 프로세스에서 사용 중이므로 ContosoUniversity.dll 파일에 액세스할 수 없음.)” 오류 메시지가 표시되면 Windows 시스템 트레이에서 IIS Express 아이콘을 찾아 마우스 오른쪽 단추로 클릭한 다음, ContosoUniversity > 사이트 중단을 클릭합니다.If you see an error message "cannot access the file ... ContosoUniversity.dll because it is being used by another process.", find the IIS Express icon in the Windows System Tray, and right-click it, then click ContosoUniversity > Stop Site.

Up 및 Down 메서드 검사Examine Up and Down methods

migrations add 명령을 실행하면 EF는 데이터베이스를 처음부터 만드는 코드를 생성했습니다.When you executed the migrations add command, EF generated the code that will create the database from scratch. 이 코드는 <timestamp>_InitialCreate.cs라는 파일의 Migrations 폴더에 있습니다.This code is in the Migrations folder, in the file named <timestamp>_InitialCreate.cs. 다음 예제와 같이 InitialCreate 클래스의 Up 메서드는 데이터 모델 엔터티 집합에 해당하는 데이터베이스 테이블을 만들고 Down 메서드는 이를 삭제합니다.The Up method of the InitialCreate class creates the database tables that correspond to the data model entity sets, and the Down method deletes them, as shown in the following example.

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 메서드를 호출합니다.Migrations calls the Up method to implement the data model changes for a migration. 업데이트를 롤백하는 명령을 입력하면 마이그레이션에서 Down 메서드를 호출합니다.When you enter a command to roll back the update, Migrations calls the Down method.

이 코드는 migrations add InitialCreate 명령을 입력했을 때 만들어진 초기 마이그레이션을 위한 것입니다.This code is for the initial migration that was created when you entered the migrations add InitialCreate command. 파일 이름에는 마이그레이션 이름 매개 변수(이 예제에서 “InitialCreate”)가 사용되며 사용자가 원하는 이름일 수 있습니다.The migration name parameter ("InitialCreate" in the example) is used for the file name and can be whatever you want. 마이그레이션에서 수행 중인 작업을 요약한 단어 또는 구를 선택하는 것이 가장 좋습니다.It's best to choose a word or phrase that summarizes what is being done in the migration. 예를 들어 이후 마이그레이션의 이름을 “AddDepartmentTable”로 지정할 수도 있습니다.For example, you might name a later migration "AddDepartmentTable".

데이터베이스가 이미 존재할 때 초기 마이그레이션을 만든 경우 데이터베이스 만들기 코드가 생성되지만 데이터베이스는 이미 데이터 모델과 일치하기 때문에 실행할 필요는 없습니다.If you created the initial migration when the database already exists, the database creation code is generated but it doesn't have to run because the database already matches the data model. 데이터베이스가 아직 없는 다른 환경에 앱을 배포하는 경우 이 코드를 실행하여 데이터베이스를 만들기 때문에 먼저 테스트하는 것이 좋습니다.When you deploy the app to another environment where the database doesn't exist yet, this code will run to create your database, so it's a good idea to test it first. 바로 이것이 앞서 연결 문자열의 데이터베이스 이름을 변경한 이유입니다. 따라서 해당 마이그레이션은 처음부터 새로운 데이터베이스를 만들 수 있습니다.That's why you changed the name of the database in the connection string earlier -- so that migrations can create a new one from scratch.

데이터 모델 스냅샷The data model snapshot

마이그레이션은 현재 데이터베이스 스키마의 스냅숏Migrations/SchoolContextModelSnapshot.cs에 만듭니다.Migrations creates a snapshot of the current database schema in Migrations/SchoolContextModelSnapshot.cs. 마이그레이션을 추가하면 EF가 데이터 모델을 스냅샷 파일과 비교하여 변경 내용을 확인합니다.When you add a migration, EF determines what changed by comparing the data model to the snapshot file.

마이그레이션을 삭제하려면 dotnet ef migrations remove 명령을 사용합니다.Use the dotnet ef migrations remove command to remove a migration. dotnet ef migrations remove는 마이그레이션을 삭제하고 스냅샷이 올바르게 다시 설정되도록 합니다.dotnet ef migrations remove deletes the migration and ensures the snapshot is correctly reset. dotnet ef migrations remove가 실패하는 경우 dotnet ef migrations remove -v를 사용하여 자세한 오류 정보를 확인하세요.If dotnet ef migrations remove fails, use dotnet ef migrations remove -v to get more information on the failure.

스냅샷 파일을 사용하는 방법에 대한 자세한 내용은 팀 환경의 EF Core 마이그레이션을 참조하세요.See EF Core Migrations in Team Environments for more information about how the snapshot file is used.

마이그레이션 적용Apply the migration

명령 창에서 다음 명령을 입력하여 데이터베이스 및 테이블을 만듭니다.In the command window, enter the following command to create the database and tables in it.

dotnet ef database update

명령의 출력은 데이터베이스를 설정하는 SQL 명령에 대한 로그가 표시되는 것 외에 migrations add 명령과 유사합니다.The output from the command is similar to the migrations add command, except that you see logs for the SQL commands that set up the database. 대부분의 로그는 다음 예제 출력에서 생략됩니다.Most of the logs are omitted in the following sample output. 로그 메시지의 세부 수준을 줄이는 것을 선호하는 경우 appsettings.Development.json 파일에서 로그 수준을 변경할 수 있습니다.If you prefer not to see this level of detail in log messages, you can change the log level in the appsettings.Development.json file. 자세한 내용은 .NET Core 및 ASP.NET Core의 로깅를 참조하세요.For more information, see .NET Core 및 ASP.NET Core의 로깅.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.2.0-rtm-35687 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'2.2.0-rtm-35687');
Done.

SQL Server 개체 탐색기를 사용하여 첫 번째 자습서에서와 같이 데이터베이스를 검사합니다.Use SQL Server Object Explorer to inspect the database as you did in the first tutorial. 데이터베이스에 어떤 마이그레이션이 적용되는지를 추적하는 __EFMigrationsHistory 테이블이 추가된 것을 확인할 수 있습니다.You'll notice the addition of an __EFMigrationsHistory table that keeps track of which migrations have been applied to the database. 해당 테이블의 데이터를 보면 첫 번째 마이그레이션에 대해 한 행이 표시됩니다.View the data in that table and you'll see one row for the first migration. (앞의 CLI 출력 예제의 마지막 로그는 이 행을 만드는 INSERT 문을 보여 줍니다.)(The last log in the preceding CLI output example shows the INSERT statement that creates this row.)

애플리케이션을 실행하여 모든 항목이 여전히 이전과 동일하게 작동하는지 확인합니다.Run the application to verify that everything still works the same as before.

학생 인덱스 페이지

CLI 및 PMC 비교Compare CLI and PMC

마이그레이션 관리를 위한 EF 도구는 Visual Studio PMC(패키지 관리자 콘솔) 에서 PowerShell cmdlet 또는 .NET Core CLI 명령에서 사용할 수 있습니다.The EF tooling for managing migrations is available from .NET Core CLI commands or from PowerShell cmdlets in the Visual Studio Package Manager Console (PMC) window. 이 자습서에는 CLI를 사용하는 방법이 나와 있지만 원하는 경우에 PMC를 사용할 수 있습니다.This tutorial shows how to use the CLI, but you can use the PMC if you prefer.

PMC 명령을 위한 EF 명령은 Microsoft.EntityFrameworkCore.Tools 패키지에 있습니다.The EF commands for the PMC commands are in the Microsoft.EntityFrameworkCore.Tools package. 이 패키지는 Microsoft.AspNetCore.App 메타패키지에 포함되어 있으므로 앱에 Microsoft.AspNetCore.App에 대한 패키지 참조가 있는 경우 패키지 참조를 추가할 필요가 없습니다.This package is included in the Microsoft.AspNetCore.App metapackage, so you don't need to add a package reference if your app has a package reference for Microsoft.AspNetCore.App.

중요: .csproj 파일을 편집하여 CLI에 대해 설치한 것과는 다른 패키지입니다.Important: This isn't the same package as the one you install for the CLI by editing the .csproj file. 끝이 Tools.DotNet으로 끝나는 CLI 패키지 이름과 달리 이름이 Tools로 끝납니다.The name of this one ends in Tools, unlike the CLI package name which ends in Tools.DotNet.

CLI 명령에 대한 자세한 내용은 .NET Core CLI를 참조하세요.For more information about the CLI commands, see .NET Core CLI.

PMC 명령에 대한 자세한 내용은 패키지 관리자 콘솔(Visual Studio)을 참조하세요.For more information about the PMC commands, see Package Manager Console (Visual Studio).

코드 가져오기Get the code

완성된 애플리케이션을 다운로드하거나 확인합니다.Download or view the completed application.

다음 단계Next step

이 자습서에서는 다음과 같은 작업을 수행합니다.In this tutorial, you:

  • 마이그레이션에 대해 알아보기Learned about migrations
  • NuGet 마이그레이션 패키지에 대해 알아보기Learned about NuGet migration packages
  • 연결 문자열 변경Changed the connection string
  • 초기 마이그레이션 만들기Created an initial migration
  • Up 및 Down 메서드 검사Examined Up and Down methods
  • 데이터 모델 스냅샷에 대해 알아보기Learned about the data model snapshot
  • 마이그레이션 적용Applied the migration

데이터 모델 확장에 관한 더 많은 고급 항목을 살펴보려면 다음 자습서로 진행합니다.Advance to the next tutorial to begin looking at more advanced topics about expanding the data model. 방식에 따라 추가 마이그레이션을 만들고 적용하게 됩니다.Along the way you'll create and apply additional migrations.