Microsoft.Data.Sqlite.SqliteException SQLite 错误 1:"仅允许在整数主键上使用自动增量"



我有一个EF Core DbContext(从IdentityDbContext继承)和一堆迁移。它在我的web应用程序中运行良好。

我有一堆的单元测试,旋转DbContext对Sqlite内存数据库使用Microsoft.EntityFrameworkCore.Sqlite.

当我运行单元测试时,我得到以下错误:

Microsoft.Data.Sqlite。sql lite Error: 'AUTOINCREMENT is only allowed on an 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
);

我怎么知道这个错误是在哪里引起的?

创建表的时候。你需要修改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
)

;

As per:-

下面有一个例外,如果一个行表有一个主键,该主键由单个列组成,并且该列的声明类型为";INTEGER"在任何大小写混合的情况下,列都成为行的别名。这样的列通常被称为"整数主键"。只有当声明的类型名称恰好为"integer"时,PRIMARY KEY列才成为整数主键。其他整数类型名称,如"INT"或";BIGINT"或"短整数";或';UNSIGNED integer ';使主键列作为具有整数亲和力和唯一索引的普通表列,而不是作为行id的别名。

CREATE TABLE - 5。rowid和INTEGER主键和AUTOINCREMENT

即AUTOINCREMENT只能应用于行id的别名。

您可能希望考虑第一段,而不是使用AUTOINCREMENT,只是使用INTEGER PRIMARY KEY:-

AUTOINCREMENT关键字会增加额外的CPU、内存、磁盘空间和磁盘I/O开销,如果不是严格需要的话,应该避免使用。通常不需要。

这是AUTOINCREMENT不自动递增,而是一个规则/约束,分配的值总是比任何分配的值高(不保证它比1高,但通常比1高)。

它效率较低,因为它需要一个额外的表sqlite_sequence,其中存储了该表的最高赋值。在确定要分配的新值时,将使用该值或实际表中的值中较高者。

如果不指定AUTOINCREMENT,则只使用表中的最大值来确定该值。如果达到了最高允许值(9223372036854775807),则尝试使用一个空闲/未使用的较低值(使用AUTOINCREMENT会导致SQLite FULL错误,而不是使用较低的空闲/未使用的值)。

最新更新