我遇到了外键约束失败错误。 .NET 8、EF Core 8.0.2

问题描述 投票:0回答:1

我正在尝试将

Order
表与
OrderItems
表链接起来。该订单的 id 为
OrderItems
,其中包含分配给该订单的商品列表。在
OrderController
中,我想要一个端点来添加一个新订单并分配其项目,但要做到这一点,我需要链接两个表的关系。

我尝试通过更改向数据库添加项目的顺序来诊断问题,但没有结果,因为我认为这是正确的插入顺序,我尝试更改导航,但它不起作用。如果我注释掉这些块,代码就会构建并运行

builder.HasOne(oi => oi.Order)
       .WithMany(o => o.OrderItems)
       .HasForeignKey(oi => oi.idOrder)
       .OnDelete(DeleteBehavior.Cascade); 

和导航。我陷入了这个问题,因为这确实是我的第一个 .NET Core 项目,我不知道如何从那里取得进展,而且我不想只注释掉关系和导航并用更多代码跳过它在

OrderController
班。

附加信息:在mysql中创建数据库,使用pomelo.entityframework建立连接

下面的部分代码 -

Order
类:

public class Order
{
    [Key]
    public int orderId { get; set; }
    [Required]
    public int idUser { get; set; }
    // public virtual User User { get; set; }
    
    [Required]
    public int idOrderStatus { get; set; }
    
    //public virtual OrderStatus OrderStatus { get; set; }
    
    public virtual ICollection<OrderItems> OrderItems { get; set; } = new List<OrderItems>();
    [Required]
    public DateTime orderDate { get; set; }
}

OrderItems

public class OrderItems
{
    [Key]
    public int orderItemId { get; set; }
    [Required]
    public int idProduct { get; set; }
    //public virtual Products Products { get; set; }  
    public virtual Products Product { get; set; }
    [Required]
    public int idOrder { get; set; }
    public virtual Order Order { get; set; }  
    [Required]
    public int orderItemQuantity { get; set; }
    [Required]
    public int orderPrice { get; set; }
}

OrderItemsConfiguration

public class OrderItemsConfiguration : IEntityTypeConfiguration<OrderItems>
{
    public void Configure(EntityTypeBuilder<OrderItems> builder)
    {
        builder.HasKey(oi => oi.orderItemId);

        builder.HasOne(oi => oi.Order)
            .WithMany(o => o.OrderItems)
            .HasForeignKey(oi => oi.idOrder)
            .OnDelete(DeleteBehavior.Cascade); 

        builder.HasOne(oi => oi.Product)
            .WithMany(p => p.OrderItems)  
            .HasForeignKey(oi => oi.idProduct)
            .OnDelete(DeleteBehavior.Restrict); 

        builder.Property(oi => oi.idProduct).IsRequired();
        builder.Property(oi => oi.idOrder).IsRequired();
        builder.Property(oi => oi.orderItemQuantity).IsRequired();
        builder.Property(oi => oi.orderPrice).IsRequired();

        builder.ToTable("OrderItems");
    }
}

OrderConfiguration

public class OrderConfiguration : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.HasKey(o => o.orderId);
        builder.Property(o => o.idUser).IsRequired();
        builder.Property(o => o.idOrderStatus).IsRequired();
        builder.Property(o => o.orderDate).IsRequired();
        builder.ToTable("Order");
    }
}

InitialSeed
为数据库播种:

private IEnumerable<Order> BuildOrderList()
{
    DateTime localDate = DateTime.Now;
    var orderList = new List<Order>();
    var orders = new Order()
    {
        orderId = 1,
        idUser = 1,
        idOrderStatus = 1,
        orderDate = localDate,
    };
    orderList.Add(orders);
    
    localDate = DateTime.Now;
    orders = new Order()
    {
        orderId = 2,
        idUser = 2,
        idOrderStatus = 2,
        orderDate = localDate,
    };
    orderList.Add(orders);
    
    localDate = DateTime.Now;
    orders = new Order()
    {
        orderId = 3,
        idUser = 3,
        idOrderStatus = 3,
        orderDate = localDate,
    };
    orderList.Add(orders);
    return orderList;
}

private IEnumerable<OrderItems> BuildOrderItemsList()
{
    var orderItemsList = new List<OrderItems>();
    var orderItems = new OrderItems()
    {
        orderItemId = 1,
        idProduct = 2,
        idOrder = 1,
        orderItemQuantity = 3,
        orderPrice = 123,
    };
    orderItemsList.Add(orderItems);
    
    orderItems = new OrderItems()
    {
        orderItemId = 2,
        idProduct = 1,
        idOrder = 2,
        orderItemQuantity = 5,
        orderPrice = 1123,
    };
    orderItemsList.Add(orderItems);
    
    orderItems = new OrderItems()
    {
        orderItemId = 3,
        idProduct = 3,
        idOrder = 3,
        orderItemQuantity = 12,
        orderPrice = 1523,
    };
    orderItemsList.Add(orderItems);
    return orderItemsList;
}

抛出的部分错误:

失败:Microsoft.EntityFrameworkCore.Update[10000]

保存上下文类型“ReOrderlyWeb.SQL.Data.ReOrderlyWebDbContext”的更改时,数据库中发生异常。

Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时发生错误。有关详细信息,请参阅内部异常。

MySqlConnector.MySqlException(0x80004005):无法添加或更新子行:外键约束失败(

reorderlywebdb
.
orderitems
,约束
FK_OrderItems_Order_orderId
外键(
orderId
)参考
order
orderId
)删除级联)

在 MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior,
......
......
在Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔acceptAllChangesOnSuccess)
Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时发生错误。有关详细信息,请参阅内部异常。

MySqlConnector.MySqlException(0x80004005):无法添加或更新子行:外键约束失败(

reorderlywebdb
.
orderitems
,约束
FK_OrderItems_Order_orderId
外键(
orderId
)参考
order
orderId
)删除级联)

mysql entity-framework-core .net-8.0
1个回答
0
投票

异常提示了问题:

MySqlConnector.MySqlException(0x80004005):无法添加或更新 子行:外键约束失败(reorderlywebdb.orderitems, CONSTRAINT FK_OrderItems_Order_orderId 外键(orderId) 参考订单(orderId)删除级联)

这里它尝试使用 OrderItem 上名为“orderId”的 FK 来关联订单。我怀疑正在发生的事情是您的 EntityTypeConfigurations 实际上并未包含在内。这些需要与 OnModelCreating 中的 DbContext 关联,通常使用

modelBuilder.ApplyConfigurationsFromAssembly()
。在
DbContext.OnModelCreating
中添加:

modelBuilder.ApplyConfigurationsFromAssembly(typeof(OrderConfiguration).Assembly);

这将添加从该程序集中的

IEntityTypeConfiguration<T>
派生的所有配置,因此您只需将其指向包含配置的任何程序集即可。

如果这些类没有被加载,那么 EF 将尝试仅使用属性来构建模型,并使用约定填充间隙,即使用 OrderId 而不是 FK 的 idOrder。

© www.soinside.com 2019 - 2024. All rights reserved.