首页 > 解决方案 > 无法从 ASP.NET MVC 项目插入 PostgreSQL 表

问题描述

所以我有这个大学的小型汽车店项目,当我想下订单时,我得到了这个:

Microsoft.EntityFrameworkCore.DbUpdateException: '更新条目时出错。有关详细信息,请参阅内部异常。

PostgresException:23503:在表“OrderDetail”上插入或更新违反外键约束“FK_OrderDetail_Order_orderId”

我使用 .NET Core 3.0.1 和 PostgreSQL 4.1.2。数据库部署在heroku上。

导致问题的代码段:

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;

            var orderDetail = new OrderDetail();

            orderDetail.orderId = order.id;

            foreach (var car in items)
            {
                orderDetail.carId = car.car.id;
                orderDetail.price = car.car.price;
            }
            appDBContent.OrderDetail.Add(orderDetail);
            appDBContent.SaveChanges();
        }
    }
}

订单详情模型:

namespace Shop.Data.Models
{
    public class OrderDetail
    {
        public int id { get; set; }

        public int orderId { get; set; }

        public int carId { get; set; }

        public int price { get; set; }

        public virtual Car car { get; set; }

        public virtual Order order { get; set; }
    }
}

订购型号:

namespace Shop.Data.Models
{
    public class Order
    {
        [BindNever]
        public int id { get; set; }

        
        public string name { get; set; }

        
        public string surname { get; set; }

        
        public string address { get; set; }

        
        public string phone { get; set; }

        
        public string email { get; set; }

        
        public DateTime orderTime { get; set; }

        public List<OrderDetail> orderDetails { get; set; }
    }
}

订单控制器:

namespace Shop.Controllers
{
    public class OrderController : Controller
    {
        private readonly IAllOrders allOrders;

        private readonly ShopCart shopCart;

        public OrderController(IAllOrders allOrders, ShopCart shopCart)
        {
            this.allOrders = allOrders;
            this.shopCart = shopCart;
        }

        public IActionResult Checkout()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Checkout(Order order)
        {
            shopCart.listShopItems = shopCart.getShopItems();

            if (shopCart.listShopItems.Count == 0)
                ModelState.AddModelError("", "You have no items in your cart!");
            if (ModelState.IsValid)
            {
                allOrders.createOrder(order);
                return RedirectToAction("Complete");
            }
            return View(order);
        }

        public IActionResult Complete()
        {
            ViewBag.Message = "Your order was processed successfully";
            return View();
        }
    }
}

表格截图

我一直在尝试修复它几天,但仍然无法弄清楚是什么问题,如果你们中的一些人可以帮助我,那就太好了:)

标签: c#sqlasp.netasp.net-mvcpostgresql

解决方案


订单在保存到数据库之前不包含 ID。不要在细节模型中设置 orderId,而是在 Order 模型中设置导航属性 Detail。


推荐阅读