C#/ EF - 在数据库中查找导航属性后无法附加到实体

时间:2016-12-28 23:26:53

标签: c# entity-framework

我已经看到有关此错误的其他几个主题,但我似乎找不到匹配(或解决)我的特定情况。

我正在尝试编辑记录(产品演示记录),该记录具有与 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”类型的实体失败,因为另一个实体   相同类型的实体已具有相同的主键值。这个   使用“附加”方法或设置状态时可能会发生   如果图中的任何实体具有,则实体为“未更改”或“已修改”   冲突的关键值。这可能是因为一些实体是新的和   尚未收到数据库生成的键值。在这种情况下使用   “添加”方法或“已添加”实体状态可跟踪图表和   然后将非新实体的状态设置为“未更改”或“已修改”为   合适的。

0 个答案:

没有答案