SQLite EF Core データベース プロバイダーの制限事項SQLite EF Core Database Provider Limitations

SQLite プロバイダーには、多くの移行に関する制限があります。The SQLite provider has a number of migrations limitations. これらの制限事項のほとんどは、基になる SQLite データベースエンジンの制限の結果であり、EF に固有のものではありません。Most of these limitations are a result of limitations in the underlying SQLite database engine and are not specific to EF.

モデリングの制限事項Modeling limitations

一般的なリレーショナルライブラリ (Entity Framework リレーショナルデータベースプロバイダーによって共有されます) は、ほとんどのリレーショナルデータベースエンジンに共通のモデリング概念用の Api を定義します。The common relational library (shared by Entity Framework relational database providers) defines APIs for modelling concepts that are common to most relational database engines. これらの概念のいくつかは、SQLite プロバイダーでサポートされていません。A couple of these concepts are not supported by the SQLite provider.

  • スキーマSchemas
  • シーケンスSequences

クエリの制限事項Query limitations

SQLite では、次のデータ型はネイティブでサポートされていません。SQLite doesn't natively support the following data types. これらの型の値の読み取りと書き込みを行うことができる EF Core、等値 () のクエリ where e.Property == value もサポートされています。EF Core can read and write values of these types, and querying for equality (where e.Property == value) is also supported. ただし、比較や順序付けなどの操作では、クライアントでの評価が必要になります。Other operations, however, like comparison and ordering will require evaluation on the client.

  • DateTimeOffsetDateTimeOffset
  • DecimalDecimal
  • TimeSpanTimeSpan
  • UInt64UInt64

DateTimeOffset はなく、DateTime 値を使用することをお勧めします。Instead of DateTimeOffset, we recommend using DateTime values. 複数のタイムゾーンを処理する場合は、保存してから適切なタイムゾーンに変換する前に、値を UTC に変換することをお勧めします。When handling multiple time zones, we recommend converting the values to UTC before saving and then converting back to the appropriate time zone.

この Decimal 型は、高レベルの精度を提供します。The Decimal type provides a high level of precision. ただし、このレベルの精度が不要な場合は、代わりに double を使用することをお勧めします。If you don't need that level of precision, however, we recommend using double instead. 値コンバーターを使用して、クラスで10進数の使用を続けることができます。You can use a value converter to continue using decimal in your classes.

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

移行に関する制限事項Migrations limitations

SQLite データベースエンジンでは、他の多くのリレーショナルデータベースでサポートされているいくつかのスキーマ操作はサポートされていません。The SQLite database engine does not support a number of schema operations that are supported by the majority of other relational databases. サポートされていない操作の1つを SQLite データベースに適用しようとすると、が NotSupportedException スローされます。If you attempt to apply one of the unsupported operations to a SQLite database then a NotSupportedException will be thrown.

OperationOperation サポート対象かどうかSupported? バージョンが必要ですRequires version
Table.addcolumnAddColumn 1.01.0
AddForeignKeyAddForeignKey
AddPrimaryKeyAddPrimaryKey
AddUniqueConstraintAddUniqueConstraint
AlterColumnAlterColumn
CreateIndexCreateIndex 1.01.0
CreateTableCreateTable 1.01.0
DropColumnDropColumn
DropForeignKeyDropForeignKey
DropIndexDropIndex 1.01.0
DropPrimaryKeyDropPrimaryKey
DropTableDropTable 1.01.0
DropUniqueConstraintDropUniqueConstraint
RenameColumnRenameColumn 2.2.22.2.2
RenameIndexRenameIndex 2.12.1
RenameTableRenameTable 1.01.0
EnsureSchemaEnsureSchema ✔ (非 op)✔ (no-op) 2.02.0
DropSchemaDropSchema ✔ (非 op)✔ (no-op) 2.02.0
挿入Insert 2.02.0
更新Update 2.02.0
削除Delete 2.02.0

移行の制限の回避策Migrations limitations workaround

これらの制限の一部を回避するには、移行でコードを手動で記述して、テーブルの再構築を実行します。You can workaround some of these limitations by manually writing code in your migrations to perform a table rebuild. テーブルのリビルドには、既存のテーブルの名前変更、新しいテーブルの作成、新しいテーブルへのデータのコピー、および古いテーブルの削除が必要です。A table rebuild involves renaming the existing table, creating a new table, copying data to the new table, and dropping the old table. これらの手順の一部を実行するには、メソッドを使用する必要があり Sql(string) ます。You will need to use the Sql(string) method to perform some of these steps.

詳細については、SQLite のドキュメントで他の種類のテーブルスキーマ変更を行う方法に関するドキュメントを参照してください。See Making Other Kinds Of Table Schema Changes in the SQLite documentation for more details.

今後、EF では、これらの操作の一部を、テーブルの再構築方法を使用してサポートすることができます。In the future, EF may support some of these operations by using the table rebuild approach under the covers. この機能は、GitHub プロジェクトで追跡できます。You can track this feature on our GitHub project.