EF6에서 EF Core로 포팅

EF Core(Entity Framework Core)는 최신 애플리케이션 아키텍처를 위해 Entity Framework를 전체적으로 재작성한 결과물입니다. 근본적인 변경으로 인해 직접 업그레이드 경로가 없습니다. 이 설명서의 목적은 EF6 애플리케이션을 EF Core로 포팅하는 방법을 종합적으로 안내하는 것입니다.

중요

포팅 프로세스를 시작하기 전에 EF Core가 애플리케이션에 대한 데이터 액세스 요구 사항을 충족하는지 확인하는 것이 중요합니다. 필요한 모든 내용은 EF Core 설명서에서 확인할 수 있습니다.

중요

이식성 분석기에 한 가지 알려진 문제(microsoft/dotnet-apiport #993)가 있습니다. 이 문제는 EF Core가 .NET 5 및 .NET 6와 호환되지 않는다고 분석기에서 잘못 보고하는 것입니다. EF Core는 .NET 5 및 .NET 6 대상 프레임워크와 100% 호환되므로 이러한 경고를 안심하고 무시해도 됩니다.

업그레이드 이유

새로운 Entity Framework 개발은 모두 EF Core에서 이루어집니다. 새로운 기능을 EF6로 백포팅할 계획은 없습니다. EF Core는 최신 .NET 런타임에서 실행되며 런타임 기능, 플랫폼별 기능(예: ASP.NET Core 또는 WPF), 언어별 기능을 최대한 활용합니다. 업그레이드를 통해 얻을 수 있는 몇 가지 이점은 다음과 같습니다.

  • EF Core에서 지속적인 성능 향상을 경험합니다. 예를 들어 EF6에서 EF Core 6로 마이그레이션한 어떤 고객은 쿼리 분할 기능 덕분에 리소스 집약적인 쿼리 사용량이 40배 감소했습니다. 최신 EF Core로 이동하는 것만으로 많은 고객이 엄청난 성능 향상을 보고하고 있습니다.
  • EF Core에서 새로운 기능을 사용합니다. EF6에는 새로운 기능이 추가되지 않습니다. Azure Cosmos DB 공급자DbContextFactory를 비롯한 새로운 기능은 모두 EF Core에만 추가됩니다. 여러 EF Core 전용 기능을 비롯하여 EF6와 EF Core를 비교한 전체 내용은 EF Core 및 EF6 비교를 참조하세요.
  • 종속성 주입을 사용하여 애플리케이션 스택을 현대화하고 gRPC 및 GraphQL 같은 기술과 데이터 액세스를 원활하게 통합합니다.

마이그레이션에 대한 참고 사항

이 설명서에서는 EF Core의 기능인 마이그레이션 용어와 혼동을 방지하기 위해 포팅 및 업그레이드 용어를 사용합니다. EF Core 내 마이그레이션은 EF6 Code First 마이그레이션과 호환되지 않습니다. 마이그레이션이 처리되는 방식이 크게 향상되었기 때문입니다. 마이그레이션 기록을 포팅하는 권장 접근 방식은 없으므로 EF Core에서 “새롭게” 시작합니다. EF6 마이그레이션에서 코드베이스 및 데이터를 유지할 수 있습니다. EF6에서 최종 마이그레이션을 적용한 다음, EF Core에서 초기 마이그레이션을 만듭니다. 앞으로 EF Core에서 기록을 추적할 수 있습니다.

업그레이드 단계

업그레이드 경로는 업그레이드 단계 및 애플리케이션 유형별로 구성된 여러 문서로 분할되었습니다.

EF Core “버전” 확인

EF Core가 도메인 모델 및 데이터베이스 구현에서 작동하는 접근 방식에는 여러 가지가 있습니다. 일반적으로 대부분의 앱은 다음 패턴 중 하나를 따르며, 포트에 접근하는 방법은 애플리케이션 “버전”에 따라 달라집니다.

데이터 소스로 기능하는 코드는 데이터 특성, 유연한 구성 또는 이 둘의 조합으로 코드와 클래스를 통해 모든 것을 모델링하는 접근 방식입니다. 처음에 데이터베이스는 EF Core에서 정의된 모델을 기반으로 생성되며, 일반적으로 추가 업데이트는 마이그레이션을 통해 처리됩니다. 이 접근 방식을 종종 “코드 우선” 방식이라고도 하지만, 이 명칭이 완전히 정확하다고는 볼 수 없습니다. 한 접근 방식에 따르면 기존 데이터베이스로 시작해 엔터티를 생성한 이후에 코드로 유지하기 때문입니다.

데이터 소스로 기능하는 데이터베이스 접근 방식에는 데이터베이스에서 코드를 리버스 엔지니어링하거나 스캐폴딩하는 작업이 포함됩니다. 스키마를 변경하면 변경 내용을 반영하도록 코드가 다시 생성되거나 업데이트됩니다. 이 접근 방식을 종종 “데이터베이스 우선” 방식이라고도 합니다.

마지막으로, 고급 하이브리드 매핑 접근 방식은 코드와 데이터베이스가 별도로 관리되고 EF Core가 이 둘 간의 매핑에 사용된다는 방침을 따릅니다. 일반적으로 이 접근 방식은 마이그레이션을 지양합니다.

다음 표에는 몇몇 일반적인 차이점이 요약되어 있습니다.

접근 방식 개발자 역할 DBA 역할 마이그레이션 스캐폴딩 리포지토리
코드 우선 엔터티 설계 및 생성된 마이그레이션 확인/사용자 지정 스키마 정의 및 변경 내용 확인 커밋당 N/A 엔터티, DbContext, 마이그레이션 추적
데이터 우선 변경 후 리버스 엔지니어링 및 생성된 엔터티 확인 데이터베이스가 재스캐폴드(re-scaffold)로 변경되면 개발자에게 알림 N/A 스키 변경당 생성된 엔터티를 확장하는 확장/partial 클래스 추적
하이브리드 엔터티 또는 데이터베이스가 변경될 때마다 매핑하도록 흐름 구성 업데이트 엔터티 및 모델 구성을 업데이트할 수 있도록 데이터베이스가 변경되면 개발자에게 알림 N/A N/A 엔터티 및 DbContext 추적

하이브리드 접근 방식은 기존 코드 및 데이터베이스 접근 방식에 비해 추가 오버헤드가 있는 고급 접근 방식입니다.

EDMX 미지원에 따른 영향 이해

EF6는 EDMX(엔터티 데이터 모델 XML)라는 특수 모델 정의 형식을 지원했습니다. EDMX 파일에는 CSDL(개념 스키마 정의), MSL(매핑 사양), SSDL(저장소 스키마 정의)을 비롯한 여러 정의가 포함되어 있습니다. EF Core는 내부 모델 그래프를 통해 도메인, 매핑 및 데이터베이스 스키마를 추적하며 EDMX 형식을 지원하지 않습니다. 이와 관련해 여러 블로그 게시물과 문서에서는 EF Core가 “코드 우선” 방식만 지원한다고 잘못 기재되어 있습니다. EF Core는 이전 섹션에서 설명한 세 가지 애플리케이션 모델을 모두 지원합니다. 데이터베이스를 리버스 엔지니어링하여 EF Core에서 모델을 다시 작성할 수 있습니다. 엔터티 모델의 시각적 표현에 EDMX를 사용하는 경우 EF Core에 유사한 기능을 제공하는 오픈 소스 EF Core Power Tools를 사용하는 것이 좋습니다.

EDMX 파일 미지원에 따른 영향에 대한 자세한 내용은 EDMX 포팅 가이드를 참조하세요.

업그레이드 단계 수행

전체 애플리케이션을 포팅할 필요는 없습니다. EF6와 EF Core는 동일한 애플리케이션에서 실행될 수 있습니다(참조: 동일한 애플리케이션에서 EF Core 및 EF6 사용). 위험을 최소화하기 위해 다음을 고려하는 것이 좋습니다.

  1. 아직 이동하지 않은 경우 .NET Core에서 EF6로 이동합니다.
  2. 앱의 작은 부분을 EF Core로 마이그레이션하고 EF6와 동시에 실행합니다.
  3. 최종적으로는 나머지 코드베이스를 EF Core로 가져오고 EF6 코드를 사용 중지합니다.

포트 자체의 경우 일반적으로 다음을 수행합니다.

  1. EF6와 EF Core 간의 동작 변경 내용을 검토합니다.
  2. EF6에서 최종 마이그레이션(있는 경우)을 수행합니다.
  3. EF Core 프로젝트를 만듭니다.
  4. 코드를 새 프로젝트에 복사하거나, 리버스 엔지니어링을 실행하거나, 이 둘을 모두 수행합니다.
  5. 참조 및 엔터티의 이름을 바꾸고 동작을 업데이트합니다.
    • System.Data.Entity - Microsoft.EntityFrameworkCore
    • DbContext 생성자를 변경하여 옵션 사용 및/또는 OnConfiguring 재정의
    • DbModelBuilder - ModelBuilder
    • DbEntityEntry<T>의 이름을 EntityEntry<T>로 바꾸기
    • Database.Log에서 Microsoft.Extensions.Logging(고급) 또는 DbContextOptionsBuilder.LogTo(단순) API로 이동
    • WithRequiredWithOptional의 변경 내용 적용(여기 참조)
    • 유효성 검사 코드 업데이트. EF Core에 기본 제공되는 데이터 유효성 검사는 없지만 직접 수행할 수 있습니다.
    • EDMX에서 포팅하는 데 필요한 단계 수행
  6. EF Core 접근 방식에 따라 특정 단계를 수행합니다.

모든 접근 방식과 관련하여 고려해야 할 여러 가지 사항이 있습니다. 따라서 EF6와 EF Core 간의 자세한 차이점을 해결하는 방법을 검토하는 것도 좋습니다.