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:外键约束失败

SQLite EF Core - '外键约束失败'

有啥方法可以获取由于执行单个语句而失败的特定外键约束?

Java JDBC PreparedStatement 外键约束失败

MySQL 错误 1822:添加外键约束失败;缺少约束索引但索引存在

外键约束,博客文章,acts_as_votable