다음을 통해 공유


EF6와 EF Core 간의 동작 변경 내용

이는 EF6와 EF Core 간 동작의 변경 내용에 대한 부분 목록입니다. 애플리케이션이 동작하는 방식을 변경할 수 있지만 EF Core로 변경한 후에 컴파일 오류로 표시되지 않으므로 애플리케이션의 포팅을 염두에 두는 것이 중요합니다

이는 포팅 프로세스의 일부로 고려해야 할 개략적인 검토를 의미합니다. 자세한 사례별 지침은 자세한 사례를 참조하세요.

DbSet.Add/Attach 및 그래프 동작

EF6에서 엔터티에 대해 DbSet.Add()를 호출하면 해당 탐색 속성에서 참조되는 모든 엔터티에 대한 재귀 검색이 생성됩니다. 검색된 모든 엔터티는 아직 컨텍스트에 의해 추적되지 않으며, 추가된 것으로 표시되기도 합니다. 모든 엔터티가 변경되지 않은 것으로 표시된 경우를 제외하고 DbSet.Attach()는 동일하게 동작합니다.

EF Core는 비슷한 재귀 검색을 수행하지만 약간 다른 규칙을 사용합니다.

  • 생성된 키에 대한 루트 엔터티는 구성되고 키는 설정되지 않은 경우 Added 상태가 됩니다.
  • 탐색 속성을 재귀적으로 검색하는 동안 발견된 엔터티:
    • 엔터티의 기본 키가 저장소로 생성된 경우
      • 기본 키가 값으로 설정되지 않으면 상태가 추가로 설정됩니다. 기본 키 값은 속성 형식(예: int0, stringnull 등)에 대한 CLR 기본값이 할당된 경우 "설정되지 않음"으로 간주됩니다.
      • 기본 키가 값으로 설정되면 상태는 변경되지 않음으로 설정됩니다.
    • 기본 키가 데이터베이스에서 생성되지 않은 경우 엔터티는 루트와 동일한 상태에 배치됩니다.
  • 이 동작 변경 내용은 AttachUpdate 메서드 그룹에만 적용됩니다. 키가 설정된 경우에도 Add는 항상 엔터티를 Added 상태로 지정합니다.
  • Attach 메서드는 키가 설정된 엔터티를 Unchanged 상태로 지정합니다. 이렇게 하면 "새 항목이 있으면 삽입하고, 그렇지 않으면 그대로 두기"가 수월해집니다. Update 메서드는 키가 설정된 엔터티를 Modified 상태로 지정합니다. 이렇게 하면 "새 항목이 있으면 삽입하고, 그렇지 않으면 업데이트하기"가 수월해집니다.

여기에서의 일반적인 철학은 Update가 연결이 끊긴 엔터티의 삽입과 업데이트를 처리하는 아주 간단한 방법이라는 것입니다. 새 엔터티가 삽입되고 기존 엔터티가 업데이트되는지 확인합니다.

동시에 Add는 엔터티를 강제로 삽입할 수 있는 쉬운 방법을 계속 제공합니다. EF에서 엔터티가 새 항목인지, 아닌지 알 수 없으므로 추가는 대부분 저장소에서 생성된 키를 사용하지 않는 경우에만 유용합니다.

EF Core의 이러한 동작에 대한 자세한 내용은 EF Core의 변경 내용 추적을 참조하세요.

Code First 데이터베이스 초기화

EF6에는 데이터베이스 연결을 선택하고 데이터베이스를 초기화하는 데 사용하는 상당한 양의 매직이 있습니다. 이러한 규칙은 다음과 같습니다.

  • 구성을 수행하지 않으면 EF6는 SQL Express 또는 LocalDb에서 데이터베이스를 선택합니다.
  • 컨텍스트와 이름이 동일한 연결 문자열이 애플리케이션의 App/Web.config 파일에 있는 경우 이 연결이 사용됩니다.
  • 데이터베이스가 없으면 해당 데이터베이스가 만들어집니다.
  • 데이터베이스에 모델의 테이블이 없으면 현재 모델에 대한 스키마가 데이터베이스에 추가됩니다. 마이그레이션을 사용하는 경우에는 데이터베이스를 만드는 데 사용됩니다.
  • 데이터베이스가 있고 EF6에서 이전에 스키마를 만든 경우 스키마가 현재 모델과의 호환성을 검사합니다. 스키마가 만들어진 후 모델이 변경되면 예외가 throw됩니다.

EF Core는 이 매직을 수행하지 않습니다.

  • 데이터베이스 연결은 코드에서 명시적으로 구성해야 합니다.
  • 초기화는 수행되지 않습니다. DbContext.Database.Migrate()를 사용하여 마이그레이션을 적용(또는 DbContext.Database.EnsureCreated()EnsureDeleted()를 사용하여 마이그레이션 없이 데이터베이스를 생성/삭제)해야 합니다.

Code First 테이블 명명 규칙

EF6는 복수화 서비스를 통해 엔터티 클래스 이름을 실행하여 엔터티가 매핑되는 기본 테이블 이름을 계산합니다.

EF Core는 엔터티가 파생 컨텍스트에서 노출되는 DbSet 속성의 이름을 사용합니다. 엔터티에 DbSet 속성이 없으면 클래스 이름이 사용됩니다.

자세한 내용은 데이터베이스 스키마 관리를 참조하세요.