마이그레이션 개요

실제 프로젝트에서 데이터 모델은 기능이 구현될 때 변경됨: 새 엔터티 또는 속성이 추가 및 제거되며 데이터베이스 스키마는 애플리케이션과 계속 동기화되도록 적절히 변경되어야 합니다. EF Core의 마이그레이션 기능은 데이터베이스 스키마를 증분 방식으로 업데이트하여 애플리케이션 데이터 모델과의 동기 상태를 유지하면서 데이터베이스에 기존 데이터를 보존하는 방법을 제공합니다.

높은 수준에서 마이그레이션은 다음 방식으로 작동합니다.

  • 데이터 모델 변경이 도입되면 개발자는 EF Core 도구를 사용하여 데이터베이스 스키마를 계속 동기화하는 데 필요한 업데이트를 설명하는 해당 마이그레이션을 추가합니다. EF Core는 현재 모델을 이전 모델의 스냅샷과 비교하여 차이점을 확인하고 마이그레이션 소스 파일을 생성합니다. 다른 소스 파일처럼 프로젝트의 소스 제어에서 해당 파일을 추적할 수 있습니다.
  • 새 마이그레이션이 생성된 후에는 다양한 방법으로 데이터베이스에 적용할 수 있습니다. EF Core는 적용된 모든 마이그레이션을 특수 기록 테이블에 기록하므로 적용된 마이그레이션과 적용되지 않은 마이그레이션을 알 수 있습니다.

이 페이지의 나머지 부분은 마이그레이션 사용에 관한 단계별 초보자 가이드입니다. 더 자세한 내용은 이 섹션의 다른 페이지를 참조하세요.

시작

다음 간단한 모델을 포함하는 첫 번째 EF Core 애플리케이션을 방금 완료했다고 가정하겠습니다.

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
}

개발하는 동안 API 만들기 및 삭제를 사용하여 필요에 따라 모델 변경을 빠르게 반복했을 수 있습니다. 하지만 이제 애플리케이션이 프로덕션 환경으로 이동하므로 전체 데이터베이스를 삭제하지 않고 스키마를 안전하게 발전시키는 방법이 필요합니다.

도구 설치

먼저 EF Core 명령줄 도구를 설치해야 합니다.

  • 일반적으로 모든 플랫폼에서 작동하는 .NET Core CLI 도구를 사용하는 것이 좋습니다.
  • Visual Studio 내에서 작업하는 것이 더 익숙하거나 EF6 마이그레이션을 사용한 적이 있는 경우 패키지 관리자 콘솔 도구를 사용할 수도 있습니다.

첫 번째 마이그레이션 만들기

이제 첫 번째 마이그레이션을 추가할 준비가 되었습니다. EF Core에 InitialCreate라는 마이그레이션을 만들도록 지시합니다.

dotnet ef migrations add InitialCreate

EF Core는 프로젝트에서 Migrations라는 디렉터리를 만들고 일부 파일을 생성합니다. 정확히 EF Core가 생성한 항목을 검사하고 가능한 경우 수정하는 것이 좋지만, 지금은 이 작업을 건너뜁니다.

데이터베이스 및 스키마 만들기

이제 EF를 통해 데이터베이스를 만들고 마이그레이션에서 스키마를 만들 수 있습니다. 다음을 통해 이 작업을 수행할 수 있습니다.

dotnet ef database update

이제 새 데이터베이스에서 애플리케이션을 실행할 준비가 되었으며 단 한 줄의 SQL도 작성할 필요가 없었습니다. 이 마이그레이션 적용 방법은 로컬 개발의 경우 적합하지만 프로덕션 환경의 경우 적합하지 않습니다. 자세한 내용은 마이그레이션 적용 페이지를 참조하세요.

모델 발전

며칠이 지났고 블로그에 만들기 타임스탬프를 추가하라는 메시지가 표시되었습니다. 애플리케이션에 필요한 변경을 완료했으며 이제 모델은 다음과 같이 표시됩니다.

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedTimestamp { get; set; }
}

모델 및 프로덕션 데이터베이스가 동기화되지 않았습니다. 데이터베이스 스키마에 새 열을 추가해야 합니다. 이를 위한 새 마이그레이션을 만들어 보겠습니다.

dotnet ef migrations add AddBlogCreatedTimestamp

나중에 프로젝트 기록을 더 쉽게 이해할 수 있도록 마이그레이션에 설명이 포함된 이름을 지정합니다.

프로젝트의 첫 번째 마이그레이션이 아니기 때문에 EF Core는 이제 열이 추가되기 전에 업데이트된 모델을 이전 모델의 스냅샷과 비교합니다. 모델 스냅샷은 마이그레이션을 추가할 때 EF Core에서 생성된 파일 중 하나이며 소스 제어에 체크 인됩니다. 해당 비교에 따라 EF Core는 열이 추가되었는지 검색하고 적절한 마이그레이션을 추가합니다.

이제 이전처럼 마이그레이션을 적용할 수 있습니다.

dotnet ef database update

이제 EF는 기존 데이터베이스가 있는지 검색합니다. 또한 위에서 첫 번째 마이그레이션이 적용되었을 때 이 팩트는 데이터베이스의 특수 마이그레이션 기록 테이블에 기록되었습니다. 이를 통해 EF는 새 마이그레이션만 자동으로 적용할 수 있습니다.

모델의 일부 제외

경우에 따라 다른 DbContext의 형식을 참조할 수 있습니다. 이로 인해 마이그레이션 충돌이 발생할 수 있습니다. 이를 방지하려면 DbContexts 중 하나의 마이그레이션에서 형식을 제외합니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IdentityUser>()
        .ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}

다음 단계

위의 내용은 마이그레이션의 간단한 소개일 뿐입니다. 마이그레이션 관리, 마이그레이션 적용 및 기타 측면을 자세히 알아보려면 다른 설명서 페이지를 참조하세요. .NET Core CLI 도구 참조에도 다른 명령에 관한 유용한 정보가 포함되어 있습니다.

추가 자료