使用实体框架向数据库添加OrderDetail



我正在使用。net Core制作Coffee Shop应用程序。

我有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));
}
谁能解释一下这是怎么回事?

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

OrderDetail作为一个集合添加到OrderHeader

public class OrderHeader {
// other properties
public virtual IColletion<OrderDetail> OrderDetail { get; set; }
}

并将OrderHeader添加到OrderDetail:

public class OrderDetail {
// other properties
public virtual OrderHeader OrderHeader { get; set; }
}

如果你已经这样做了,继续下面的

现在不是用OrderHeaderId创建一个新的OrderDetail,而是添加一个对OrderHeader的引用。

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

关系文档

是的,但是看看我的模型:

OrderHeader模型
public class OrderHeader
{
[Key]
public int Id { get; set; }
public string ApplicationUserId { get; set; }
[ForeignKey("ApplicationUserId")]
public ApplicationUser ApplicationUser { get; set; }
public DateTime OrderDate { get; set; }
[Required]
public string FullName { get; set; }
}

和OrderDetail模型:

public class OrderDetail
{
[Key]
public int Id { get; set; }

public int OrderHeaderId { get; set; }
[ForeignKey("OrderHeaderId")]
public virtual OrderHeader OrderHeader { get; set; }

public int ProductId { get; set; }
[ForeignKey("ProductId")]
public virtual Product Product { get; set; }
}