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.

特定の操作を実行するために再構築が試行されます。A rebuild will be attempted in order to perform certain operations. 再構築を行うことができるのは、EF Core モデルの一部であるデータベースアーティファクトだけです。Rebuilds are only possible for database artifacts that are part of your EF Core model. データベースアーティファクトがモデルの一部ではない場合 (たとえば、移行中に手動で作成された場合)、 NotSupportedException がまだスローされます。If a database artifact isn't part of the model--for example, if it was created manually inside a migration--then a NotSupportedException is still thrown.

操作Operation サポート対象Supported? バージョンが必要ですRequires version
AddCheckConstraintAddCheckConstraint ✔ (再構築)✔ (rebuild) 5.05.0
Table.addcolumnAddColumn
AddForeignKeyAddForeignKey ✔ (再構築)✔ (rebuild) 5.05.0
AddPrimaryKeyAddPrimaryKey ✔ (再構築)✔ (rebuild) 5.05.0
AddUniqueConstraintAddUniqueConstraint ✔ (再構築)✔ (rebuild) 5.05.0
AlterColumnAlterColumn ✔ (再構築)✔ (rebuild) 5.05.0
CreateIndexCreateIndex
CreateTableCreateTable
DropCheckConstraintDropCheckConstraint ✔ (再構築)✔ (rebuild) 5.05.0
DropColumnDropColumn ✔ (再構築)✔ (rebuild) 5.05.0
DropForeignKeyDropForeignKey ✔ (再構築)✔ (rebuild) 5.05.0
DropIndexDropIndex
DropPrimaryKeyDropPrimaryKey ✔ (再構築)✔ (rebuild) 5.05.0
DropTableDropTable
DropUniqueConstraintDropUniqueConstraint ✔ (再構築)✔ (rebuild) 5.05.0
RenameColumnRenameColumn 2.22.2
RenameIndexRenameIndex ✔ (再構築)✔ (rebuild)
RenameTableRenameTable
EnsureSchemaEnsureSchema ✔ (非 op)✔ (no-op)
DropSchemaDropSchema ✔ (非 op)✔ (no-op)
挿入Insert
更新Update
削除Delete

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

再構築を実行するために、移行でコードを手動で記述することで、これらの制限の一部を回避できます。You can workaround some of these limitations by manually writing code in your migrations to perform a rebuild. テーブルの再構築では、新しいテーブルを作成し、新しいテーブルにデータをコピーし、古いテーブルを削除して、新しいテーブルの名前を変更します。Table rebuilds involve creating a new table, copying data to the new table, dropping the old table, renaming the new 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.

べき等スクリプトの制限事項Idempotent script limitations

他のデータベースとは異なり、SQLite には手続き型の言語が含まれていません。Unlike other databases, SQLite doesn't include a procedural language. このため、べき等移行スクリプトに必要な if then ロジックを生成する方法はありません。Because of this, there is no way to generate the if-then logic required by the idempotent migration scripts.

最後の移行がデータベースに適用されていることがわかっている場合は、その移行から最新の移行にスクリプトを生成できます。If you know the last migration applied to a database, you can generate a script from that migration to the latest migration.

dotnet ef migrations script CurrentMigration

それ以外の場合は、を使用して移行を適用することをお勧めし dotnet ef database update ます。Otherwise, we recommend using dotnet ef database update to apply migrations. EF Core 5.0 以降では、コマンドの実行時にデータベースファイルを指定できます。Starting in EF Core 5.0, you can specify the database file when running the command.

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

関連項目See also