首页 > 解决方案 > 使用实体框架将 OrderDetail 添加到数据库

问题描述

我正在使用 .NET Core 制作咖啡店应用程序。

我有OrderHeaderOrderDetail实体。我为它们创建了模型类,OrderHeaderOrderDetail使用外键连接它们。在控制器中,当我尝试将数据保存到OrderHeader时,OrderDetail会发生注释。

这是我的代码:

[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("Summary")]
public IActionResult SummaryPost(ProductUserVM ProductUserVM)
{
    var claimsIdentity = (ClaimsIdentity)User.Identity;
    var claim = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier);

    OrderHeader orderHeader = new OrderHeader()
        {
            ApplicationUserId = claim.Value,
            FullName = ProductUserVM.ApplicationUser.FullName,
            OrderDate = DateTime.Now
        };

    _db.OrderHeader.Add(orderHeader);
    _db.SaveChanges();

    foreach(var prod in ProductUserVM.ProductList)
    {
        OrderDetail orderDetail = new OrderDetail()
            {
                OrderHeaderId = orderHeader.Id,
                ProductId = prod.Id
            };
        _db.OrderDetail.Add(orderDetail);
    }

    _db.SaveChanges();

    return RedirectToAction(nameof(Confirmation));
}

有人可以解释发生了什么吗?

标签: c#.netentity-frameworkasp.net-core

解决方案


您不想引用 ,而是Id要引用整个对象。

OrderDetail作为集合添加到OrderHeader.

public class OrderHeader {

  // other properties

  public virtual IColletion<OrderDetail> OrderDetail { get; set; }

}

并将其添加OrderHeaderOrderDetail

public class OrderDetail {

  // other properties

  public virtual OrderHeader OrderHeader { get; set; }

}

如果您已经这样做了,请继续下面。

现在,不要使用 来创建新OrderDetailOrderHeaderId,而是添加对的引用OrderHeader

foreach (var prod in ProductUserVM.ProductList)
{
    OrderDetail orderDetail = new OrderDetail()
    {
        OrderHeader = orderHeader,
        ProductId = prod.Id
    };

    _db.OrderDetail.Add(orderDetail);
}

关系文档


推荐阅读