EF6에서 EF Core로 포팅하는 세부 사례

이 문서에서는 EF6와 EF Core의 몇 가지 분명한 차이점을 자세히 설명합니다. 코드를 포팅할 때 이 가이드를 참조하세요.

데이터베이스 연결 구성

EF Core와 달리 EF6를 다양한 데이터 원본에 연결하는 방법에는 몇 가지 차이점이 있습니다. 코드를 포팅하는 경우를 숙지해야 합니다.

  • 연결 문자열: EF Core는 EF6처럼 서로 다른 연결 문자열에 대해 여러 생성자 오버로드를 직접 지원하지 않습니다. 대신 DbContextOptions를 사용합니다. 파생된 형식으로도 여러 생성자 오버로드를 제공할 수 있지만 옵션을 통해 연결을 매핑해야 합니다.
  • 구성 및 캐시: EF Core는 외부 서비스 공급자에 연결할 수 있는 내부 인프라를 사용하여 종속성 주입을 보다 강력하고 유연하게 구현하도록 지원합니다. 캐시를 플러시해야 하는 상황을 처리하기 위해 애플리케이션에서 이를 관리할 수 있습니다. EF6 버전에서는 플러시할 수 없도록 제한되어 있습니다.
  • 구성 파일: EF6는 공급자를 포함할 수 있는 구성 파일을 통한 구성을 지원합니다. EF Core에는 공급자 어셈블리에 대한 직접 참조와 명시적 공급자 등록(예: UseSqlServer)이 필요합니다.
  • 연결 팩터리: EF6는 연결 팩터리를 지원합니다. EF Core는 연결 팩터리를 지원하지 않으며 항상 연결 문자열이 필요합니다.
  • 로깅: 일반적으로 EF Core의 로깅은 훨씬 더 강력하며 미세 조정된 구성을 위한 여러 옵션이 있습니다.

규칙

EF6는 사용자 지정(‘간단’) 규칙 및 모델 규칙을 지원합니다. 간단한 규칙은 EF Core의 사전 규칙 모델 구성과 유사합니다. 다른 규칙은 모델을 빌드하는 과정으로 지원됩니다.

EF6는 모델을 빌드한 후 규칙을 실행합니다. EF Core는 모델을 빌드하는 중에 적용합니다. EF Core에서 DbContext를 사용하여 활성 세션에서 모델 빌드를 분리할 수 있습니다. 규칙을 사용하여 초기화된 모델을 만들 수 있습니다.

데이터 유효성 검사

EF Core는 데이터 유효성 검사를 지원하지 않으며 모델 및 마이그레이션을 빌드하기 위한 데이터 주석만 사용합니다. 웹/MVC에서 WinForms 및 WPF에 이르는 대부분의 클라이언트 라이브러리에서는 사용할 데이터의 유효성 검사를 구현할 수 있습니다.

곧 제공될 기능

EF6에는 현재 EF Core에 없지만 제품 로드맵에 있는 몇 가지 기능이 있습니다.

  • TPC(구체적 형식당 테이블)는 EF6에서 ‘엔터티 분할’과 함께 지원되었습니다. TPC는 EF7의 로드맵에 있습니다.
  • EF6의 저장 프로시저 매핑을 사용하면 만들기, 업데이트, 삭제 작업을 저장 프로시저에 위임할 수 있습니다. 현재 EF Core는 읽기에 대해서만 저장 프로시저에 매핑할 수 있습니다. CUD(만들기, 업데이트, 삭제) 지원은 EF7의 로드맵에 있습니다.
  • EF6의 복합 형식은 EF Core의 소유 형식과 유사합니다. 그러나 전체 기능 집합은 EF7의 값 개체로 처리됩니다.

더 이상 사용하지 않는 ObjectContext

EF Core는 ObjectContext 대신 DbContext를 사용합니다. 따라서 IObjectContextAdapter를 사용하는 코드를 업데이트해야 합니다. 이는 PreserveChanges 또는 OverwriteChanges 병합 옵션이 있는 쿼리에 사용되기도 했습니다. EF Core의 유사한 기능은 Reload 메서드를 참조하세요.

모델 구성

EF6 및 EF Core의 모델이 디자인되는 방식에는 중요한 차이점이 많습니다. EF Core는 조건부 매핑을 온전히 지원하지 않습니다. 모델 작성기 버전이 없습니다.

다른 차이점은 다음과 같습니다.

형식 검색

EF Core에서 엔진은 다음 세 가지 방법으로 엔터티 유형을 검색합니다.

  • DbContext에서 DbSet<TEntity>을 표시합니다. TEntity는 추적하려는 형식입니다.
  • 코드의 어딘가에서 Set<TEntity>을 참조합니다.
  • 검색된 형식에서 참조하는 복합 형식은 재귀적으로 검색됩니다(예: Blog에서 Post를 참조하고 Blog를 검색할 수 있으면 Post도 검색됨).

어셈블리에서는 파생 형식을 스캔하지 않습니다.

매핑

EF6의 .Map() 확장이 EF Core에서 오버로드 및 확장 메서드로 대체되었습니다. 예를 들어 ‘HasDiscriminator()’를 사용하여 TPH(계층당 하나의 테이블)를 구성할 수 있습니다. 모델링 상속을 참조하세요.

상속 매핑

EF6는 TPH(계층당 하나의 테이블), TPT(형식당 하나의 테이블) 및 TPC(구체적 클래스당 하나의 테이블)를 지원하고 계층 구조의 다양한 수준에서 다양한 버전의 하이브리드 매핑을 사용하도록 설정했습니다. EF Core는 단방향 모델링(TPT 또는 TPH)을 위해 지속적으로 상속 체인이 필요하며 EF7에서 TPC에 대한 지원을 추가할 계획입니다.

모델링 상속을 참조하세요.

특성

EF6는 속성의 인덱스 특성을 지원했습니다. EF Core에서는 복합 인덱스가 필요한 시나리오를 더 쉽게 만들 수 있도록 형식 수준에서 적용됩니다. EF Core는 데이터 주석이 있는 복합 키를 지원하지 않습니다(예: KeyAttribute와 함께 ColumnAttribute의 Order 사용).

자세한 내용은 인덱스 및 제약 조건을 참조하세요.

필수 및 선택 사항

EF Core 모델 빌드에서 IsRequired는 보안 주체 끝에 필요한 것만 구성합니다. 이제 HasForeignKey가 보안 주체 끝을 구성합니다. 코드를 포팅하려면 .Navigation().IsRequired()를 대신 사용하는 것이 더 간단합니다. 예시:

EF6:

modelBuilder.Entity<Instructor>()
    .HasRequired(t => t.OfficeAssignment)
    .WithRequiredPrincipal(t => t.Instructor);

EF Core 6:

modelBuilder.Entity<Instructor>()
    .HasOne(t => t.OfficeAssignment)
    .WithOne(t => t.Instructor)
    .HasForeignKey<OfficeAssignment>();

modelBuilder.Entity<Instructor>()
    .Navigation(t => t.OfficeAssignment)
    .IsRequired();

modelBuilder.Entity<OfficeAssignment>()
    .Navigation(t => t.Instructor)
    .IsRequired();

기본적으로 모든 것이 선택 사항이므로 일반적으로 .IsRequired(false)를 호출할 필요가 없습니다.

공간 지원

EF Core는 타사 라이브러리 커뮤니티 라이브러리인 NetTopologySuite와 통합하여 공간 지원을 제공합니다.

독립 연결

EF Core는 독립 연결(두 엔터티 간의 관계를 엔터티 자체와 독립적으로 정의할 수 있는 EDM 개념)을 지원하지 않습니다. EF Core가 지원하는 유사한 개념은 섀도 속성입니다.

마이그레이션

EF Core는 데이터베이스 이니셜라이저 또는 자동 마이그레이션을 지원하지 않습니다. EF Core에는 migrate.exe가 없지만 마이그레이션 번들을 생성할 수 있습니다.

Visual Studio 도구

EF Core에는 디자이너가 없고 데이터베이스에서 모델을 업데이트하는 기능도 없으며 모델 우선 흐름도 없습니다. 리버스 엔지니어링 마법사도 없고 기본 제공 템플릿도 없습니다.

위 기능이 EF Core와 함께 제공되지 않아도 OSS 커뮤니티 프로젝트에서 추가 도구를 제공합니다. 특히 EF Core Power Tools는 다음을 제공합니다.

  • 데이터베이스 프로젝트(.dacpac)를 지원하는 Visual Studio 내부에서 리버스 엔지니어링을 수행합니다. 템플릿 기반 코드 사용자 지정을 포함합니다.
  • 모델 그래핑과 스크립팅을 통해 DbContext를 시각적으로 검사합니다.
  • GUI를 사용하여 Visual Studio 내에서 마이그레이션을 관리합니다.

커뮤니티 도구 및 확장의 전체 목록은 EF Core 도구 및 확장을 참조하세요.

Change tracking

EF6와 EF Core가 변경 내용 추적을 처리하는 방법에는 몇 가지 차이점이 있습니다. 다음 표에 요약된 차이점을 확인하세요.

기능 EF6 EF Core
엔터티 상태 전체 그래프 추가/연결 분리된 엔터티에 대한 탐색 지원
고아 유지됨 삭제됨
연결이 끊긴 자체 추적 엔터티 지원됨 지원되지 않음
변형 속성에서 수행 지원 필드에서 수행*
데이터 바인딩 .Local .Local.ToObservableCollection 또는 .ToBindingList
변경 내용 검색 전체 그래프 엔터티당

*기본적으로 속성 알림은 EF Core에서 트리거되지 않으므로 알림 엔터티를 구성해야 합니다.

EF Core는 EF6만큼 자주 변경 검색을 자동으로 호출하지 않습니다.

EF Core에서는 변경 추적기에 대한 상세 DebugView를 도입합니다. 자세한 내용은 추적기 디버깅 변경을 참조하세요.

쿼리

EF6에는 EF Core에 없는 몇 가지 쿼리 기능이 있습니다. 다음 범위가 포함됩니다.

  • 몇 가지 일반적인 C# 함수 및 SQL 함수 매핑
  • 쿼리 및 업데이트에 대한 명령 트리 인터셉션
  • TVP(테이블 반환 매개 변수)에 대한 API 지원

EF6는 지연 로드 프록시에 대한 기본 제공 지원이 있습니다. 바로 EF Core용 옵트인 패키지입니다(관련 데이터의 지연 로드 참조).

EF Core를 사용하면 FromSQL로 원시 SQL을 통해 작성할 수 있습니다.