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
  • 計算列Computed columns

クエリの制限事項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 support. ただし、比較のようなその他の操作と、順序付けすると、クライアントで評価が必要です。Other operations, however, like comparison and ordering will require evaluation on the client.

  • DateTimeOffsetDateTimeOffset
  • Decimal (10 進数型)Decimal
  • TimeSpanTimeSpan
  • UInt64UInt64

代わりにDateTimeOffsetDateTime 値を使用することをお勧めします。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. サポートされていない操作のいずれかの SQLite データベースに適用しようとしたかどうか、NotSupportedExceptionがスローされます。If you attempt to apply one of the unsupported operations to a SQLite database then a NotSupportedException will be thrown.

操作Operation サポートされていますか。Supported? バージョンが必要です。Requires version
AddColumnAddColumn 11.0
AddForeignKeyAddForeignKey
AddPrimaryKeyAddPrimaryKey
AddUniqueConstraintAddUniqueConstraint
AlterColumnAlterColumn
CreateIndexCreateIndex 11.0
CreateTableCreateTable 11.0
DropColumnDropColumn
DropForeignKeyDropForeignKey
DropIndexDropIndex 11.0
DropPrimaryKeyDropPrimaryKey
DropTableDropTable 11.0
DropUniqueConstraintDropUniqueConstraint
RenameColumnRenameColumn 2.2.22.2.2
RenameIndexRenameIndex 2.12.1
RenameTableRenameTable 11.0
EnsureSchemaEnsureSchema ✔ (操作なし)✔ (no-op) 2.02.0
DropSchemaDropSchema ✔ (操作なし)✔ (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.