我根据 Gosha Dudar 的视频教程在 ASP.NET 上写了一个站点,遇到以下错误:SqlException: The INSERT statement conflict with the FOREIGN KEY constraint "FK_OrderDetail_Order_orderId"。冲突发生在数据库“Shop”、表“dbo.Order”、列“id”中。代码中没有错误,只有在结帐时引发了这个异常
编码:
using Shop.Data.Interfaces;
using Shop.Data.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Shop.Data.Repository
{
public class OrdersRepository : IAllOrders
{
private readonly AppDBContent appDBContent;
private readonly ShopCart shopCart;
public OrdersRepository(AppDBContent appDBContent, ShopCart shopCart)
{
this.appDBContent = appDBContent;
this.shopCart = shopCart;
}
public void createOrder(Order order)
{
order.orderTime = DateTime.Now;
appDBContent.Order.Add(order);
var items = shopCart.listShopItems;
foreach(var el in items)
{
var orderDetail = new OrderDetail()
{
carId = el.car.id,
orderId = order.id,
price = el.car.price
};
appDBContent.OrderDetail.Add(orderDetail);
}
appDBContent.SaveChanges();
}
}
}
订购型号:
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
namespace Shop.Data.Models
{
public class Order
{
[BindNever]
public int id { get; set; }
[Display(Name="Введіть ім'я")]
[StringLength(20)]
[Required(ErrorMessage = "Довжина ім'я не менше 20 символів")]
public string name { get; set; }
[Display(Name = "Введіть прізвище")]
[StringLength(20)]
[Required(ErrorMessage = "Довжина прізвища не менше 20 символів")]
public string surname { get; set; }
[Display(Name = "Введіть адресу")]
[StringLength(20)]
[Required(ErrorMessage = "Довжина адреси не менше 20 символів")]
public string address { get; set; }
[Display(Name = "Введіть телефон")]
[DataType(DataType.PhoneNumber)]
[StringLength(10)]
[Required(ErrorMessage = "Довжина телефона не менше 10 символів")]
public string phone { get; set; }
[Display(Name = "Введіть електронну пошту")]
[DataType(DataType.EmailAddress)]
[StringLength(30)]
[Required(ErrorMessage = "Довжина електронної пошти не менше 30 символів")]
public string email { get; set; }
[BindNever]
[ScaffoldColumn(false)]
public DateTime orderTime { get; set; }
public List<OrderDetail> orderDetails { get; set; }
}
}
订单详情型号:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Shop.Data.Models
{
public class OrderDetail
{
public int id { get; set; }
public int orderId { get; set; }
public int carId { get; set; }
public uint price { get; set; }
public virtual Car car { get; set; }
public virtual Order order { get; set; }
}
}
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_OrderDetail_Order_orderId"
这意味着你的钥匙有问题
order_id
。最有可能的是,您试图插入一条 order_id 不存在的记录。因此 FK 没有什么可参考的。appDBContent.SaveChanges()
在行后插入这里有一个解释:ASP.NET 的插入语句与外键约束冲突
在你需要添加
OrderRepository
的方法之后CreateOrder
appDBContent.SaveChanges();
appDBContent.Order.Add(order);