当我尝试向订单表添加数据时,发生了错误。
添加数据成功了,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。我只是不知道为什么会出现这个错误。
1条答案
按热度按时间0h4hbjxa1#
您得到的错误是SQLite错误,不应该与EF直接相关。记住这一点,如果您尝试插入一行,其中包含引用另一个表的列,您必须确保列的内容也存在于引用的表中。要调试此错误,您可以打开SQLite数据库,然后运行带有相同的**INSERT语句错误中描述的值,并查看发生了什么。
因此,在用EF尝试插入的值替换
@p0
,@p1
等之后,您将运行以下语句: