SQLite EF Core 数据库提供程序限制SQLite EF Core Database Provider Limitations

SQLite 提供程序有很多迁移限制。 其中的大多数限制是由基础 SQLite 数据库引擎中的限制引起的,并不特定于 EF。

建模限制Modeling limitations

公共关系库(由实体框架关系数据库提供程序共享)定义了用于建模大多数关系数据库引擎所共有的概念的 Api。 SQLite 提供程序不支持其中几个概念。

  • 架构
  • 序列

查询限制Query limitations

SQLite 本身并不支持以下数据类型。 EF Core 可以读取和写入这些类型的值,也支持查询是否相等( where e.Property == value )。 但其他操作(如比较和排序)将需要对客户端进行评估。

  • DateTimeOffset
  • 小数
  • TimeSpan
  • UInt64

DateTimeOffset建议使用 DateTime 值,而不是。 处理多个时区时,建议在保存之前将值转换为 UTC,然后将其转换回适当的时区。

Decimal类型提供了较高的精度。 但是,如果不需要该级别的精度,则建议改为使用 double。 您可以使用值转换器在类中继续使用 decimal。

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

迁移限制Migrations limitations

SQLite 数据库引擎不支持许多其他关系数据库所支持的架构操作。 如果尝试将不受支持的操作之一应用于 SQLite 数据库,则 NotSupportedException 会引发。

操作支持?需要版本
AddColumn1.0
AddForeignKey
AddPrimaryKey
AddUniqueConstraint
AlterColumn
CreateIndex1.0
CreateTable1.0
DropColumn
DropForeignKey
DropIndex1.0
DropPrimaryKey
DropTable1.0
DropUniqueConstraint
RenameColumn2.2.2
RenameIndex2.1
RenameTable1.0
EnsureSchema✔(无操作)2.0
DropSchema✔(无操作)2.0
插入2.0
更新2.0
删除2.0

迁移限制解决方法Migrations limitations workaround

通过在迁移中手动编写代码来执行表重新生成,可以解决其中一些限制。 表重新生成包括重命名现有表、创建新表、将数据复制到新表和删除旧表。 你将需要使用 Sql(string) 方法来执行其中一些步骤。

有关更多详细信息,请参阅在 SQLite 文档中进行其他类型的表架构更改

将来,EF 可以通过使用表中的 “重新生成” 方法来支持这些操作。 你可以在 GitHub 项目上跟踪此功能