SQLite EF Core 資料庫提供者限制

SQLite 提供者有一些移轉限制。 這些限制大部分都是基礎 SQLite 資料庫引擎的限制所造成,不是 EF 特有的。

模型限制

Entity Framework 關係資料庫提供者所共用的通用關係庫 () 定義 API,以建立大部分關係資料庫引擎通用概念的 API。 SQLite 提供者不支援其中幾個概念。

  • 結構描述
  • 序列

查詢限制

SQLite 原生不支援下列資料類型。 EF Core 可以讀取和寫入這些類型的值,也支援查詢相等 (where e.Property == value) 。 不過,其他作業,例如比較和排序,將需要在用戶端上進行評估。

  • DateTimeOffset
  • Decimal
  • TimeSpan
  • UInt64

DateTimeOffset我們建議使用 DateTime 值,而不是 。 處理多個時區時,建議您先將值轉換成 UTC,再儲存再轉換回適當的時區。

Decimal 類型提供高精確度層級。 不過,如果您不需要該精確度層級,建議您改用 double。 您可以使用 值轉換器 ,繼續在類別中使用十進位。

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

移轉限制

SQLite 資料庫引擎不支援大部分其他關係資料庫所支援的架構作業。 如果您嘗試將其中一個不支援的作業套用至 SQLite 資料庫, NotSupportedException 則會擲回 。

系統會嘗試重建,以執行特定作業。 只有屬於 EF Core 模型一部分的資料庫成品,才能重建。 例如,如果資料庫成品不是模型的一部分,如果在移轉內手動建立, NotSupportedException 則仍會擲回 。

作業 是否支援? 需要版本
AddCheckConstraint ✔ (重建) 5.0
AddColumn
AddForeignKey ✔ (重建) 5.0
AddPrimaryKey ✔ (重建) 5.0
AddUniqueConstraint ✔ (重建) 5.0
AlterColumn ✔ (重建) 5.0
CreateIndex
CreateTable
DropCheckConstraint ✔ (重建) 5.0
DropColumn ✔ (重建) 5.0
DropForeignKey ✔ (重建) 5.0
DropIndex
DropPrimaryKey ✔ (重建) 5.0
DropTable
DropUniqueConstraint ✔ (重建) 5.0
RenameColumn
RenameIndex ✔ (重建)
RenameTable
EnsureSchema ✔ (無作業)
DropSchema ✔ (無作業)
插入
更新
刪除

移轉限制因應措施

您可以藉由在移轉中手動撰寫程式碼來執行重建,來因應這些限制。 資料表重建牽涉到建立新的資料表、將資料複製到新資料表、卸載舊資料表、重新命名新資料表。 您必須使用 Sql(string) 方法來執行其中一些步驟。

如需詳細資訊,請參閱 SQLite 檔中 的進行其他類型的資料表架構變更

等冪腳本限制

不同于其他資料庫,SQLite 不包含程式語言。 因此,無法產生等冪移轉腳本所需的 if-then 邏輯。

如果您知道上次套用至資料庫的移轉,您可以從該移轉產生腳本到最新的移轉。

dotnet ef migrations script CurrentMigration

否則,建議您使用 dotnet ef database update 來套用移轉。 從 EF Core 5.0 開始,您可以在執行 命令時指定資料庫檔案。

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

另請參閱