SQLite 错误 19:“外键约束失败”
Posted
技术标签:
【中文标题】SQLite 错误 19:“外键约束失败”【英文标题】:SQLite Error 19: 'FOREIGN KEY constraint failed' 【发布时间】:2021-12-28 20:03:28 【问题描述】:我正在开发一个 C# 应用程序,并且我正在使用实体框架来处理数据库。 我的项目中有以下数据库设计:
每当我尝试删除“rentals”表中的一行时,都会收到“Foreign Key Constraint Failed”错误,但我不知道为什么。
我的出租表迁移如下所示:
migrationBuilder.CreateTable(
name: "Rentals",
columns: table => new
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
CustomerId = table.Column<int>(type: "INTEGER", nullable: false),
ProductsId = table.Column<int>(type: "INTEGER", nullable: false),
DateAssigned = table.Column<DateTime>(type: "TEXT", nullable: false),
Active = table.Column<bool>(type: "INTEGER", nullable: false)
,
constraints: table =>
table.PrimaryKey("PK_Rentals", x => x.Id);
table.ForeignKey(
name: "FK_Rentals_Customers_CustomerId",
column: x => x.CustomerId,
principalTable: "Customers",
principalColumn: "Id");
table.ForeignKey(
name: "FK_Rentals_Products_ProductId",
column: x => x.ProductId,
principalTable: "Products",
principalColumn: "Id");
);
modelBuilder.Entity("API.Entities.Rentals", b =>
b.HasOne("API.Entities.Customer", "Customer")
.WithMany("Rentals")
.HasForeignKey("CustomerId")
.OnDelete(DeleteBehavior.NoAction)
.IsRequired();
b.HasOne("API.Entities.Product", "Product")
.WithMany("Rentals")
.HasForeignKey("ProductId")
.OnDelete(DeleteBehavior.NoAction)
.IsRequired();
b.Navigation("Customer");
b.Navigation("Product");
);
关于我做错了什么有什么想法吗?
【问题讨论】:
倾向于正确调试。捕获 SQL,然后在 SSMS 中执行它并获取完整的错误消息。错误中的内容比您告诉我们的要多,并且它在 VS 中也可见(在异常中),除非您忽略它。查看异常的所有属性。 @TomTom - “你的 SQLite 客户端”而不是 SSMS? 啊,忽略了。不确定他们使用什么,但获取发送到数据库的 SQL 并查看 INNNER EXCEPTIONS。有更多可用信息。 当外键约束失败时,通常是因为您依赖于在 Rentals 上找到的主键,这意味着您可能没有在设计中向我们展示关系。在您重新启动并遇到错误之间,您可能删除了另一行,该行从该行的租金中引用了此 FK。这可以解释你描述的行为。但不是“必须”成为问题。我不知道 ORM 会在外键约束这样重要的东西上“出故障”。这将使该软件对公司毫无用处 【参考方案1】:好像有问题。
重启VS后,错误不再出现。
【讨论】:
以上是关于SQLite 错误 19:“外键约束失败”的主要内容,如果未能解决你的问题,请参考以下文章
Django 2.0:sqlite IntegrityError:外键约束失败
Java JDBC PreparedStatement 外键约束失败