다음을 통해 공유


마이그레이션 기록 테이블 사용자 지정

참고 항목

EF6 이상만 - 이 페이지에서 다루는 기능, API 등은 Entity Framework 6에 도입되었습니다. 이전 버전을 사용하는 경우 이 정보의 일부 또는 전체가 적용되지 않습니다.

참고 항목

이 문서에서는 기본 시나리오에서 Code First 마이그레이션을 사용하는 방법을 알고 있다고 가정합니다. 방법을 모르는 경우, 계속하기 전에 Code First 마이그레이션을 읽어야 합니다.

마이그레이션 기록 테이블이란?

마이그레이션 기록 테이블은 데이터베이스에 적용된 마이그레이션에 대한 세부 정보를 저장하기 위해 Code First 마이그레이션에서 사용되는 테이블입니다. 기본적으로 데이터베이스의 테이블 이름은 __MigrationHistory이며 데이터베이스에 첫 번째 마이그레이션을 적용할 때 만들어집니다. Entity Framework 5에서 애플리케이션이 Microsoft SQL Server 데이터베이스를 사용한 경우 이 테이블은 시스템 테이블이었습니다. 그러나 Entity Framework 6에서 변경되었으며 마이그레이션 기록 테이블은 더 이상 시스템 테이블로 표시되지 않습니다.

마이그레이션 기록 테이블을 사용자 지정하는 이유는 무엇인가요?

마이그레이션 기록 테이블은 Code First 마이그레이션에서만 사용되며 수동으로 변경하면 마이그레이션이 중단될 수 있습니다. 그러나 경우에 따라 기본 구성이 적합하지 않아 테이블을 사용자 지정해야 합니다. 예를 들면 다음과 같습니다.

  • 타사 마이그레이션 제공자를 사용하려면 열의 이름 및/또는 패싯을 변경해야 합니다.
  • 테이블의 이름을 변경하려는 경우
  • __MigrationHistory 테이블에 기본이 아닌 스키마를 사용해야 합니다.
  • 지정된 버전의 컨텍스트에 대한 추가 데이터를 저장해야 하므로 테이블에 추가 열을 추가해야 합니다.

주의 사항

마이그레이션 기록 테이블을 변경하는 것은 강력하지만 과도하게 사용하지 않도록 주의해야 합니다. EF 런타임은 현재 사용자 지정된 마이그레이션 기록 테이블이 런타임과 호환되는지 여부를 확인하지 않습니다. 호환되지 않으면 애플리케이션이 런타임에 중단되거나 예측할 수 없는 방식으로 동작을 수행할 수 있습니다. 데이터베이스당 여러 컨텍스트를 사용하는 경우 이는 더욱 중요합니다. 이 경우 여러 컨텍스트가 동일한 마이그레이션 기록 테이블을 사용하여 마이그레이션에 대한 정보를 저장할 수 있습니다.

마이그레이션 기록 테이블을 사용자 지정하는 방법

시작하기 전에 첫 번째 마이그레이션을 적용하기 전에만 마이그레이션 기록 테이블을 사용자 지정할 수 있다는 점을 알아야 합니다. 이제 코드로 넘어갑니다.

먼저 ystem.Data.Entity.Migrations.History.HistoryContext 클래스에서 파생된 클래스를 만들어야 합니다. HistoryContext 클래스는 DbContext 클래스에서 파생되므로 마이그레이션 기록 테이블을 구성하는 것은 흐름 API를 사용하여 EF 모델을 구성하는 것과 매우 유사합니다. OnModelCreating 메서드를 재정의하고 흐름 API를 사용하여 테이블을 구성하기만 하면 됩니다.

참고 항목

일반적으로 EF 모델을 구성할 때에는 DbContext.OnModelCreating()에 빈 본문이 있으므로 재정의된 OnModelCreating 메서드에서 base.OnModelCreating()을 호출할 필요가 없습니다. 마이그레이션 기록 테이블을 구성할 때는 해당하지 않습니다. 이 경우 OnModelCreating() 재정의에서 가장 먼저 수행해야 할 작업은 실제로 base.OnModelCreating()을 호출하는 것입니다. 이렇게 하면 재정의 메서드에서 조정하는 기본 방식으로 마이그레이션 기록 테이블이 구성됩니다.

마이그레이션 기록 테이블의 이름을 바꾸고 "admin"이라는 사용자 지정 스키마에 배치한다고 가정해 보겠습니다. 또한 DBA는 MigrationId 열의 이름을 Migration_ID로 바꾸려고 합니다.  HistoryContext에서 파생된 다음 클래스를 만들어 이 작업을 수행할 수 있습니다.

    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations.History;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class MyHistoryContext : HistoryContext
        {
            public MyHistoryContext(DbConnection dbConnection, string defaultSchema)
                : base(dbConnection, defaultSchema)
            {
            }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<HistoryRow>().ToTable(tableName: "MigrationHistory", schemaName: "admin");
                modelBuilder.Entity<HistoryRow>().Property(p => p.MigrationId).HasColumnName("Migration_ID");
            }
        }
    }

사용자 지정 HistoryContext가 준비되면 코드 기반 구성을 통해 등록하여 EF가 이를 인식하도록 해야 합니다.

    using System.Data.Entity;

    namespace CustomizableMigrationsHistoryTableSample
    {
        public class ModelConfiguration : DbConfiguration
        {
            public ModelConfiguration()
            {
                this.SetHistoryContext("System.Data.SqlClient",
                    (connection, defaultSchema) => new MyHistoryContext(connection, defaultSchema));
            }
        }
    }

다 되었습니다. 이제 패키지 관리자 콘솔, Enable-Migrations, Add-Migration 및 마지막으로 Update-Database로 이동할 수 있습니다. 그러면 HistoryContext 파생 클래스에 지정한 세부 정보에 따라 구성된 마이그레이션 기록 테이블이 데이터베이스에 추가됩니다.

Migrations History Table