我有一個 EF Core DbContext(從 IdentityDbContext 繼承)和一堆遷移。在我的網路應用程式中一切正常。
我有一堆單元測驗,它們使用 Microsoft.EntityFrameworkCore.Sqlite 針對 Sqlite 記憶體資料庫啟動 DbContext。
當我運行單元測驗時,出現以下錯誤:
Microsoft.Data.Sqlite.SqliteException SQLite 錯誤 1:“AUTOINCREMENT 只允許在 INTEGER PRIMARY KEY 上”。
我怎么知道這個錯誤是在哪里引起的?
script-database -Idempotent不會產生 的任何實體AUTOINCREMENT,但我認為它使用的是 T-SQL 方言,而不是 Sqlite?
我怎樣才能找到這個問題的根本原因?
更新
好的,所以我將除錯器設定為在引發 Sqlite 例外時中斷,然后為 Microsoft.Data.Sqlite 加載符號,并且SqliteCommand.PrepareAndEnumerateStatements()我可以看到該_commandText欄位具有以下值,該值是由 EntityFramework 從遷移生成的:
CREATE TABLE "ef_temp_AspNetRoleClaims" (
"Id" int NOT NULL CONSTRAINT "PK_AspNetRoleClaims" PRIMARY KEY AUTOINCREMENT,
"ClaimType" nvarchar(1000) NULL,
"ClaimValue" nvarchar(1000) NULL,
"RoleId" uniqueidentifier NOT NULL,
CONSTRAINT "FK_AspNetRoleClaims_AspNetRoles_RoleId" FOREIGN KEY ("RoleId") REFERENCES "AspNetRoles" ("Id") ON DELETE CASCADE
);
uj5u.com熱心網友回復:
我怎么知道這個錯誤是在哪里引起的?
這將是創建表的時間。您需要更改 CREATE SQL;要使用 AUTOINCREMENT,您必須使用 INTEGER 而不是 INT。即INTEGER PRIMARY KEY AUTOINCREMENT。
所以 :-
CREATE TABLE "ef_temp_AspNetRoleClaims" (
"Id" integer NOT NULL CONSTRAINT "PK_AspNetRoleClaims" PRIMARY KEY AUTOINCREMENT,
"ClaimType" nvarchar(1000) NULL,
"ClaimValue" nvarchar(1000) NULL,
"RoleId" uniqueidentifier NOT NULL,
CONSTRAINT "FK_AspNetRoleClaims_AspNetRoles_RoleId" FOREIGN KEY ("RoleId") REFERENCES "AspNetRoles" ("Id") ON DELETE CASCADE
)
;
按照 :-
除了下面提到的一個例外,如果 rowid 表有一個由單個列組成的主鍵,并且該列的宣告型別是大小寫混合的“INTEGER”,那么該列將成為 rowid 的別名。這樣的列通常稱為“整數主鍵”。如果宣告的型別名稱恰好是“INTEGER”,則 PRIMARY KEY 列僅成為整數主鍵。其他整數型別名稱(如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)導致主鍵串列現為具有整數關聯和唯一索引的普通表列,而不是作為 rowid 的別名。
創建表 - 5. ROWID 和 INTEGER PRIMARY KEY和AUTOINCREMENT
即 AUTOINCREMENT 只能應用于 rowid 的別名。
您可能希望考慮第一段而不是使用 AUTOINCREMENT 只使用INTEGER PRIMARY KEY:-
AUTOINCREMENT 關鍵字會增加額外的 CPU、記憶體、磁盤空間和磁盤 I/O 開銷,如果不是絕對需要,應該避免使用。通常不需要。
也就是說 AUTOINCREMENT 不會自動遞增,而是一個規則/約束,即分配的值總是比任何分配的值高(不保證它高 1,但通常高 1)。
它的效率較低,因為它需要一個額外的表 sqlite_seqeunce,其中存盤了表的最高分配值。確定要分配的新值時,將使用此值或實際表中的值中的較高者。
如果沒有 AUTOINCREMENT,如果未指定任何值,則將僅使用表中的最大值來確定該值。此確定,如果已達到最高允許值 (9223372036854775807),則嘗試使用空閑/未使用的較低值(使用 AUTOINCREMENT 會導致 SQLite FULL 錯誤,而不是使用較低的空閑/未使用值)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327912.html
