错误:SQLite错误19:'FOREIGN KEY约束失败'

yjghlzjz  于 2023-03-19  发布在  SQLite
关注(0)|答案(1)|浏览(425)

当我尝试向订单表添加数据时,发生了错误。
添加数据成功了,Map、验证甚至数据库本身都没有错误。但是一天后,当我添加错误捕获中间件并填充Dish表时,它停止了工作。表的结构或与之关联的代码没有任何变化。第二天我不明白我做错了什么,它怎么会坏掉。
支付和交付实体已经填写在数据库中。而且我使用的是SQLite。
错误:
未通过:Microsoft.EntityFrameworkCore.数据库.命令[20102]无法执行数据库命令(13毫秒)[参数=[@p0 ='?'(数据库类型= GUID),@p1 =“?”(数据库类型= GUID),@p2 =“?”(数据库类型= Int 32),@p3 =“?”(数据库类型= GUID)],命令类型=“文本”,命令超时=“30”]将值(@p0,@p1,@p2,@p3)插入到“内容”中(“ID”,“DishId”,“编号”,“订单ID”);

失败:Microsoft.EntityFrameworkCore.Update[10000]保存对上下文类型“Restaurant.Persistents. RestaurantDbContext”的更改时数据库中出现异常。Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时出错。有关详细信息,请参阅内部异常。Microsoft.Data.Sqlite.SqliteException(0x 80004005):SQLite错误19:“外键约束失败”。在Microsoft。数据。Sqlite.SqliteException。在Microsoft抛出异常。在Microsoft。数据。Sqlite.SqliteDataReader.NextResult()。在Microsoft。数据。Sqlite.SqliteCommand.ExecuteReader(命令行为)在Microsoft。数据。Sqlite. SqliteCommand. ExecuteReader异步(命令行为行为,取消令牌取消令牌)在Microsoft。数据。Sqlite.SqliteCommand. ExecuteDbDataReader异步(命令行为行为,取消令牌取消令牌)。实体框架核心存储。关系命令。执行读取器异步(关系命令参数对象参数对象,取消令牌取消令牌)。实体框架核心存储。关系命令。执行读取器异步(关系命令参数对象参数对象,取消令牌取消令牌)。实体框架核心。更新。读取器修改命令批处理。执行异步(I关系连接连接,取消令牌取消令牌)内部异常堆栈跟踪结束---位于Microsoft。实体框架核心。更新。读取器修改命令批处理。执行异步(IRelationalConnection连接,取消令牌取消令牌)位于Microsoft。实体框架核心。更新。内部。批处理执行器。执行异步(IEnumerable 1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable 1命令批处理,IRelationalConnection连接,取消令牌取消令牌)。实体框架核心。更新。内部。批处理执行器。执行异步(IEnumerable 1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList 1个要保存的条目,取消令牌取消令牌)。实体框架核心。更改跟踪。内部。状态管理器。保存更改异步(状态管理器状态管理器,布尔值接受所有成功更改,取消令牌取消令牌)。实体框架核心。数据库上下文。保存更改异步(布尔值接受所有成功更改,异常(Microsoft.EntityFrameworkCore.数据库更新):保存实体更改时出错。有关详细信息,请参阅内部异常。Microsoft.Data.Sqlite.SqliteException(0x 80004005):SQLite错误19:“外键约束失败”。在Microsoft。数据。Sqlite.SqliteException。在Microsoft抛出异常。在Microsoft。数据。Sqlite.SqliteDataReader.NextResult()。在Microsoft。数据。Sqlite.SqliteCommand.ExecuteReader(命令行为)在Microsoft。数据。Sqlite. SqliteCommand. ExecuteReader异步(命令行为行为,取消令牌取消令牌)在Microsoft。数据。Sqlite.SqliteCommand. ExecuteDbDataReader异步(命令行为行为,取消令牌取消令牌)。实体框架核心存储。关系命令。执行读取器异步(关系命令参数对象参数对象,取消令牌取消令牌)。实体框架核心存储。关系命令。执行读取器异步(关系命令参数对象参数对象,取消令牌取消令牌)。实体框架核心。更新。读取器修改命令批处理。执行异步(I关系连接连接,取消令牌取消令牌)内部异常堆栈跟踪结束---位于Microsoft。实体框架核心。更新。读取器修改命令批处理。执行异步(IRelationalConnection连接,取消令牌取消令牌)位于Microsoft。实体框架核心。更新。内部。批处理执行器。执行异步(IEnumerable 1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable 1命令批处理,IRelationalConnection连接,取消令牌取消令牌)。实体框架核心。更新。内部。批处理执行器。执行异步(IEnumerable 1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList 1个要保存的条目,取消令牌取消令牌)。实体框架核心。更改跟踪。内部。状态管理器。保存更改异步(状态管理器状态管理器,布尔值接受所有成功更改,取消令牌取消令牌)。实体框架核心。数据库上下文。保存更改异步(布尔值接受所有成功更改,取消令牌取消令牌)
如果需要,我可以添加一个指向项目git的链接。

实体及其配置

订单

public class Order
    {
        // Primary key
        public Guid Id { get; set; }

        public bool? IsCompleated { get; set; }
        public DateTime Date { get; set; }
        public string CustomerName { get; set; }
        public string CustomerPhone { get; set; }
        public string? CustomerMail { get; set; }
        public string CustomerAddress { get; set; }
        public string? Comment { get; set; }

        // Foreign key
        public Guid DeliveryId { get; set; }
        public Guid PaymentId { get; set; }

        // Navigation property
        public List<Content> Contents { get; set; }
        public Payment Payment { get; set; }
        public Delivery Delivery { get; set; }
    }

相关实体交付和付款相同
交付

public class Delivery
    {
        // Primary key
        public Guid Id { get; set; }

        public string Title { get; set; }

        // Foreign key

        // Navigation property
        public List<Order> Orders { get; set; }
    }

内容

public class Content
    {
        // Primary key
        public Guid Id { get; set; }

        public int Number { get; set; }

        // Foreign key
        public Guid DishId { get; set; }
        public Guid OrderId { get; set; }

        // Navigation property
        public Dish Dish { get; set; }
        public Order Order { get; set; }
    }

配置文件,省略了一切,除了键方便.
订单

public void Configure(EntityTypeBuilder<Order> builder)
        {
            builder.HasKey(order => order.Id);
            builder.HasIndex(order => order.Id)
                .IsUnique();

            builder.HasOne(order => order.Delivery)
                .WithMany(delivery => delivery.Orders)
                .HasForeignKey(order => order.DeliveryId);
            builder.HasOne(order => order.Payment)
                .WithMany(payment => payment.Orders)
                .HasForeignKey(order => order.PaymentId);
        }

交付

public void Configure(EntityTypeBuilder<Delivery> builder)
        {
            builder.HasKey(delivery => delivery.Id);
            builder.HasIndex(delivery => delivery.Id)
                .IsUnique();
        }

内容

public void Configure(EntityTypeBuilder<Content> builder)
        {
            builder.HasKey(content => content.Id);
            builder.HasIndex(content => content.Id)
                .IsUnique();

            builder.HasOne(content => content.Order)
                .WithMany(order => order.Contents)
                .HasForeignKey(content => content.OrderId);
            builder.HasOne(content => content.Dish)
                .WithMany(dish => dish.Contents)
                .HasForeignKey(content => content.DishId);
        }

我使用postman发送了一个查询,并等待新记录添加到表中。但结果是,只有Get请求起作用。任何从代码更改数据库的尝试都停止工作,并给予一个辅键错误。但您可以通过DB Browser for SQLite添加它。我是第一次使用ef core。我只是不知道为什么会出现这个错误。

0h4hbjxa

0h4hbjxa1#

您得到的错误是SQLite错误,不应该与EF直接相关。记住这一点,如果您尝试插入一行,其中包含引用另一个表的列,您必须确保列的内容也存在于引用的表中。要调试此错误,您可以打开SQLite数据库,然后运行带有相同的**INSERT语句错误中描述的值,并查看发生了什么。
因此,在用EF尝试插入的值替换@p0@p1等之后,您将运行以下语句:

INSERT INTO "Contents" ("Id", "DishId", "Number", "OrderId") VALUES (@p0, @p1, @p2, @p3)

相关问题