我已经看到有关此错误的其他几个主题,但我似乎找不到匹配(或解决)我的特定情况。
我正在尝试编辑记录(产品演示记录),该记录具有与 0:n 产品记录相关的导航属性。
提交编辑表单时,演示的先前选择的产品不会通过模型绑定(这实际上是我的问题的关键)。因此,我必须出去获取当前分配的产品,以便我可以通过“UpdateSelectedProducts”方法计算需要在记录中添加或删除哪些新分配的产品。
将我的实体状态设置为已修改时,执行此操作会抛出错误。
这是我的编辑方法的代码。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Demo demo, string[] selectedProducts)
{
if (ModelState.IsValid)
{
// Get the currently assigned products so that we can detect differences
demo.Products = db.Demos.AsNoTracking().Where(x => x.DemoID == demo.DemoID).FirstOrDefault().Products;
UpdateSelectedProducts(selectedProducts, demo);
// Update the demo record
db.Entry(demo).State = EntityState.Modified; // Error is thrown here
db.SaveChanges();
return RedirectToAction("Index");
}
}
private void UpdateSelectedProducts(string[] selectedProductIds, Demo demo)
{
var demoProducts = new HashSet<int>(demo.Products.Select(x => x.ProductID));
foreach (var product in db.Products)
{
if (selectedProductIds.Contains(product.ProductID.ToString()))
{
if (!demoProducts.Contains(product.ProductID))
{
// Add product to demo if it is selected, and not already part of the demo
demo.Products.Add(product);
}
}
else
{
if (demoProducts.Contains(product.ProductID))
{
// Remove the product from the demo if it is part of the demo, but not selected
demo.Products.Remove(product);
}
}
}
}
此外,我尝试将AsNoTracking()与Where子句一起使用,但这会得到相同的结果。
有什么想法吗?
附加“CPPv2.Models.Demo”类型的实体失败,因为另一个实体 相同类型的实体已具有相同的主键值。这个 使用“附加”方法或设置状态时可能会发生 如果图中的任何实体具有,则实体为“未更改”或“已修改” 冲突的关键值。这可能是因为一些实体是新的和 尚未收到数据库生成的键值。在这种情况下使用 “添加”方法或“已添加”实体状态可跟踪图表和 然后将非新实体的状态设置为“未更改”或“已修改”为 合适的。