gpt4 book ai didi

asp.net-mvc - 在修改现有子 Entity Framework 的同时添加新子对象

转载 作者:行者123 更新时间:2023-12-04 00:24:17 24 4
gpt4 key购买 nike

我看过一些类似问题的答案,但它们似乎并不适合我。

我正在尝试合并来自 Entity Framework 的模式:DbContext(第 90 页),但它似乎不起作用。我正在使用的代码如下:

[HttpPost]
public ActionResult Edit(Order order)
{
if (ModelState.IsValid)
{
db.Orders.Add(order);
db.Entry(order).State = EntityState.Modified;

foreach (var orderDetail in order.OrderDetails)
{
if (orderDetail.OrderId == 0)
{
db.Entry(orderDetail).State = EntityState.Added;
}
else
{
db.Entry(orderDetail).State = EntityState.Modified;
}
// The example order that I'm updating has two child entities
// so this orderId will be for the third, added one.
int addedOrderDetailId = order.OrderDetails[2].OrderId;
}
db.SaveChanges();
return RedirectToAction("Index");
}

ViewBag.CustomerId = new SelectList(db.Customers, "CustomerId", "CompanyName", order.CustomerId);

return View(order);

}

我一直在运行一个示例,其中 Order 对象有两个现有的 OrderDetail 对象,我正在尝试添加第三个。我包含了 addedOrderDetailId 变量,以便我可以将它添加到“观察”并查看它何时发生变化

我发现正在发生的是, Entity Framework 将添加的 OrderDetail 对象的 OrderId(在进入 foreach 循环时为 0)更新为 Order 对象的 OrderId。这发生在通过 foreach 循环的第一次迭代之后(当第一个子实体将其状态更改为已修改。这意味着所有三个子实体都被标记为已修改。这导致 SaveChanges() 尝试更新条目进入不存在的数据库。

如果其他人遇到过这个问题,那么我会很高兴为解决这个问题提供任何建议。我还必须处理被删除的现有子对象,但我还没有解决这个问题,所以如果有人知道这个模式,那也将不胜感激。

编辑:

在接受 Slauma 的建议并删除 db.Orders.Add(order) 之后。我能够将调用移动到 foreach 循环下的 db.Entry(order).State 。这允许我遍历循环并将每个 OrderDetail 对象的状态设置为针对现有对象进行修改并为添加的对象添加。然后我只需将父级的 OrderId 分配给子级的 OrderId,更新就成功了。我还包含了在编辑期间用于删除子对象的代码。我不确定这有多有效,但它有效。这是修改后的代码:
    [HttpPost]
public ActionResult Edit(Order order)
{
if (ModelState.IsValid)
{
List<int> previousProductIds = db.OrderDetails
.Where(ep => ep.OrderId == order.OrderId)
.Select(ep => ep.ProductId)
.ToList();

List<int> currentProductIds = order.OrderDetails
.Select(o => o.ProductId)
.ToList();

List<int> deletedProductIds = previousProductIds
.Except(currentProductIds).ToList();


foreach (var deletedProductId in deletedProductIds)
{
OrderDetail deletedOrderDetail = db.OrderDetails
.Where(od => od.OrderId == order.OrderId && od.ProductId == deletedProductId)
.Single();

db.Entry(deletedOrderDetail).State = EntityState.Deleted;
}

foreach (var orderDetail in order.OrderDetails)
{
if (orderDetail.OrderId == 0)
{
db.Entry(orderDetail).State = EntityState.Added;
orderDetail.OrderId = order.OrderId;
}
else
{
db.Entry(orderDetail).State = EntityState.Modified;
}
}
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.CustomerId = new SelectList(db.Customers, "CustomerId", "CompanyName", order.CustomerId);
return View(order);
}

最佳答案

从您的代码中删除此行:

db.Orders.Add(order);

这实际上会将包含所有 orderDetails 的订单放入 Added状态。关系修复(在 Add 中自动发生)将设置 OrderId所有 OrderDetails到订单的关键。当你进入循环 orderDetail.OrderId!= 0对于所有明细项目,您总是进入将状态设置为 Modified 的分支.没有订单详情项目在 Added循环结束时不再声明。

关于asp.net-mvc - 在修改现有子 Entity Framework 的同时添加新子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com