이 자습서에서는 데이터 모델 변경 관리에 특화된 마이그레이션 기능 사용을 시작하는 방법을 배웁니다 EF Core. 이후 자습서에서는 데이터 모델을 변경할 때 더 많은 마이그레이션을 추가합니다.
이 자습서에서는 다음을 수행합니다.
- 마이그레이션에 대해 알아보기
- 초기 마이그레이션 만들기
- 위쪽 및 아래쪽 메서드 검사
- 데이터 모델 스냅샷에 대해 알아보기
- 마이그레이션 적용
Prerequisites
About migrations
새 애플리케이션을 개발하는 경우 데이터 모델은 자주 변경되며 모델이 변경될 때마다 데이터베이스와 동기화를 가져옵니다. 데이터베이스가 없는 경우 데이터베이스를 만들도록 Entity Framework를 구성하여 이러한 자습서를 시작했습니다. 그런 다음, 엔터티 클래스를 추가, 제거 또는 변경하거나 DbContext 클래스를 변경할 때마다 데이터베이스를 삭제하고 EF에서 모델과 일치하는 새 데이터베이스를 만들고 테스트 데이터로 시드할 수 있습니다.
데이터베이스를 데이터 모델과 동기화된 상태로 유지하는 이 메서드는 애플리케이션을 프로덕션 환경에 배포할 때까지 잘 작동합니다. 애플리케이션이 프로덕션 환경에서 실행되는 경우 일반적으로 유지하려는 데이터를 저장하며, 새 열 추가와 같은 변경 작업을 수행할 때마다 모든 항목이 손실되지 않도록 합니다. EF Core 마이그레이션 기능은 EF가 새 데이터베이스를 만드는 대신 데이터베이스 스키마를 업데이트할 수 있도록 하여 이 문제를 해결합니다.
마이그레이션을 사용하려면 PMC( 패키지 관리자 콘솔 ) 또는 CLI를 사용할 수 있습니다. 이 자습서에서는 CLI 명령을 사용하는 방법을 보여 줍니다. PMC에 대한 정보는 이 자습서의 끝부분에 있습니다.
데이터베이스 삭제
dotnet tool install --global dotnet-ef
dotnet ef database drop
Note
기본적으로 설치할 .NET 이진 파일의 아키텍처는 현재 실행 중인 OS 아키텍처를 나타냅니다. 다른 OS 아키텍처를 지정하려면 dotnet 도구 설치, --arch 옵션을 참조하세요. 자세한 내용은 GitHub 이슈 dotnet/AspNetCore.Docs #29262를 참조하세요.
다음 섹션에서는 CLI 명령을 실행하는 방법을 설명합니다.
초기 마이그레이션 만들기
변경 내용을 저장하고 프로젝트를 빌드합니다. 그런 다음 명령 창을 열고 프로젝트 폴더로 이동합니다. 이 작업을 수행하는 빠른 방법은 다음과 같습니다.
솔루션 탐색기의 프로젝트를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 파일 탐색기에서 폴더 열기를 선택합니다.
주소 표시줄에 "cmd"를 입력하고 Enter 키를 누릅니다.
명령 창에서 다음 명령을 입력합니다.
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."라는 오류 메시지가 표시되면 Windows 시스템 트레이에서 IIS Express 아이콘을 찾아 마우스 오른쪽 단추로 클릭한 다음 ContosoUniversity > 중지 사이트를 클릭합니다.
위쪽 및 아래쪽 메서드 검사
명령을 실행하면 migrations add EF에서 데이터베이스를 처음부터 만드는 코드를 생성했습니다. 이 코드는 마이그레이션 폴더에 있으며, 파일 이름은 <timestamp>_InitialCreate.cs입니다. 클래스의 Up 메서드는 데이터 모델 엔터티 집합에 해당하는 데이터베이스 테이블을 생성하며, 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 마이그레이션 제거 명령을 사용하여 마이그레이션을 제거합니다.
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 명령 또는 PMC(Visual Studio 패키지 관리자 콘솔 ) 창의 PowerShell cmdlet에서 사용할 수 있습니다. 이 자습서에서는 CLI를 사용하는 방법을 보여 주지만 원하는 경우 PMC를 사용할 수 있습니다.
PMC 명령에 대한 EF 명령은 Microsoft.EntityFrameworkCore.Tools 패키지에 있습니다. 이 패키지는 Microsoft.AspNetCore.App 메타패키지에 포함되므로 앱에 패키지 참조가 있는 경우 패키지 참조 Microsoft.AspNetCore.App를 추가할 필요가 없습니다.
중요하다: 이 패키지는 파일을 편집 .csproj 하여 CLI에 설치한 패키지와 동일하지 않습니다. 이름의 끝이 Tools로 끝나며, 이는 Tools.DotNet로 끝나는 CLI 패키지의 이름과 다릅니다.
CLI 명령에 대한 자세한 내용은 .NET CLI를 참조하세요.
PMC 명령에 대한 자세한 내용은 패키지 관리자 콘솔(Visual Studio)을 참조하세요.
코드 가져오기
Next step
다음 자습서로 이동하여 데이터 모델 확장에 대한 고급 항목을 살펴보세요. 그 과정에서 추가 마이그레이션을 만들고 적용합니다.
ASP.NET Core