SQLite EF Core 데이터베이스 공급자 제한 사항

SQLite 공급자에는 여러 마이그레이션 제한 사항이 있습니다. 이러한 제한 사항의 대부분은 기본 SQLite 데이터베이스 엔진의 제한 사항의 결과이며 EF와 관련이 없습니다.

모델링 제한 사항

EF Core 관계형 데이터베이스 공급자가 공유하는 공통 관계형 라이브러리는 대부분의 관계형 데이터베이스 엔진에 공통적인 개념을 모델링하기 위한 API를 정의합니다. 이러한 개념 중 몇 가지는 SQLite 공급자에서 지원되지 않습니다.

  • 스키마
  • 시퀀스
  • 데이터베이스에서 생성된 동시성 토큰(설명서 참조)

쿼리 제한 사항

SQLite는 기본적으로 다음 데이터 형식을 지원하지 않습니다. EF Core는 이러한 형식의 값을 읽고 쓸 수 있으며 같음(where e.Property == value)에 대한 쿼리도 지원됩니다. 그러나 비교 및 순서 지정과 같은 다른 작업에는 클라이언트에 대한 평가가 필요합니다.

  • DateTimeOffset
  • decimal
  • TimeSpan
  • ulong

DateTimeOffset대신 DateTime 값을 사용하는 것이 좋습니다. 여러 표준 시간대를 처리할 때 값을 저장한 다음 적절한 표준 시간대로 다시 변환하기 전에 값을 UTC로 변환하는 것이 좋습니다.

decimal 형식은 높은 수준의 정밀도를 제공합니다. 그러나 이러한 수준의 정밀도가 필요하지 않은 경우 대신 double 사용하는 것이 좋습니다. 값 변환기을 사용해 클래스에서 decimal를 계속해서 사용할 수 있습니다.

modelBuilder.Entity<MyEntity>()
    .Property(e => e.DecimalProperty)
    .HasConversion<double>();

마이그레이션 제한 사항

SQLite 데이터베이스 엔진은 대부분의 다른 관계형 데이터베이스에서 지원하는 여러 스키마 작업을 지원하지 않습니다. 지원되지 않는 작업 중 하나를 SQLite 데이터베이스에 적용하려고 하면 NotSupportedException이 throw됩니다.

특정 작업을 수행하기 위해 다시 빌드를 시도합니다. 다시 빌드는 EF Core 모델의 일부인 데이터베이스 아티팩트에서만 가능합니다. 데이터베이스 아티팩트가 모델의 일부가 아닌 경우(예: 마이그레이션 내에서 수동으로 만든 경우) NotSupportedException 계속 throw됩니다.

운영 지원되나요?
AddCheckConstraint ✔ (다시 빌드)
AddColumn
외래 키 추가 ✔ (다시 빌드)
Add기본키 ✔ (다시 빌드)
AddUniqueConstraint (고유 제약 조건 추가) ✔ (다시 빌드)
AlterColumn ✔ (다시 빌드)
인덱스 생성
테이블생성
체크 제약 조건 삭제 ✔ (다시 빌드)
열삭제 ✔ (다시 빌드)
DropForeignKey (외래 키 삭제) ✔ (다시 빌드)
DropIndex
기본 키 삭제 ✔ (다시 빌드)
DropTable
고유 제약 조건 삭제 ✔ (다시 빌드)
RenameColumn
인덱스 이름 변경 ✔ (다시 빌드)
테이블 이름 변경
EnsureSchema ✔ (no-op)
드롭스키마 (DropSchema) ✔ (no-op)
삽입
업데이트
삭제

마이그레이션 제한 해결 방법

마이그레이션에서 코드를 수동으로 작성하여 다시 빌드를 수행하여 이러한 제한 사항 중 일부를 해결할 수 있습니다. 테이블 다시 작성에는 새 테이블 만들기, 새 테이블에 데이터 복사, 이전 테이블 삭제, 새 테이블 이름 바꾸기가 포함됩니다. 이러한 단계 중 일부를 수행하려면 Sql 메서드를 사용해야 합니다.

자세한 내용은 SQLite 설명서에서 다른 종류의 테이블 스키마 변경 내용을 참조하세요.

Idempotent 스크립트에서의 제한 사항

다른 데이터베이스와 달리 SQLite에는 절차 언어가 포함되지 않습니다. 이로 인해, 멱등 마이그레이션 스크립트에 필요한 if-then 논리를 생성할 방법이 없습니다.

데이터베이스에 적용된 마지막 마이그레이션을 알고 있는 경우 해당 마이그레이션에서 최신 마이그레이션으로 스크립트를 생성할 수 있습니다.

dotnet ef migrations script CurrentMigration

그렇지 않으면 dotnet ef database update를 사용하여 마이그레이션을 적용하는 것이 좋습니다. 명령을 실행할 때 데이터베이스 파일을 지정할 수 있습니다.

dotnet ef database update --connection "Data Source=My.db"

동시 마이그레이션 보호

EF9는 동시 마이그레이션 실행으로부터 보호하기 위한 마이그레이션 잠금 메커니즘 을 도입했습니다. 연결이 닫히면 자동으로 해제되는 세션 수준 애플리케이션 잠금(sp_getapplock)을 사용하는 SQL Server 달리 SQLite에는 기본 제공 애플리케이션 잠금이 없습니다. 대신 EF Core는 __EFMigrationsLock 테이블을 만들고 잠금을 획득하기 위해 행을 삽입합니다.

사용되지 않는 잠금 처리

애플리케이션이 예기치 않게 종료되는 경우(예: 마이그레이션 중에 프로세스가 종료됨) 테이블의 잠금 행이 __EFMigrationsLock 정리되지 않을 수 있습니다. 이렇게 하면 각 시도가 잠금이 해제될 때까지 무기한 대기하므로 후속 마이그레이션이 완료되지 않습니다.

데이터베이스에서 __EFMigrationsLock 테이블을 삭제하여 방치된 잠금을 해결하십시오.

DROP TABLE "__EFMigrationsLock";

또는 테이블에서 모든 행을 삭제합니다.

DELETE FROM "__EFMigrationsLock";

잠금을 지운 후 후속 마이그레이션 작업은 정상적으로 진행됩니다. 테이블은 필요에 따라 자동으로 다시 만들어집니다.

참조 항목