我正在尝试将
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
异常提示了问题:
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。