【问题标题】:Error in Updating dbModel of entity framework更新实体框架的dbModel时出错
【发布时间】:2016-04-11 07:52:45
【问题描述】:

我的帖子编辑操作的这个打击代码:

public ActionResult EditProduct(EditProductModel viewModel,HttpPostedFileBase file)
    {
        if (Session["AdminId"] != null && Session["AdminName"] != null)
        {
            repository = new Repository();
            var pro = repository.FindProductById(viewModel.Id);

            // Automappper configoration.
            var config = new MapperConfiguration(cgf => cgf.CreateMap<EditProductModel, Product>());
            var mapper = config.CreateMapper();
            pro = mapper.Map<Product>(viewModel);

            repository.UpdateProduct(pro);// Error
            repository.SaveChanges();

            return RedirectToAction("ShowProduct",new{id = AdminId});
        }
        return RedirectToAction("AdminLogin");
    }

包含此代码的 repository.UpdateProduct():

public void UpdateProduct(Product obj)
    {

        entities.Entry(obj).State = EntityState.Modified;
    }

但是上面的代码抛出了这个错误:

附加类型为“MobileShop.Models.Product”的实体失败,因为同一类型的另一个实体已经具有相同的主键值。如果图中的任何实体具有冲突的键值,则在使用“附加”方法或将实体的状态设置为“未更改”或“已修改”时,可能会发生这种情况。这可能是因为某些实体是新实体,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“已添加”实体状态来跟踪图形,然后将非新实体的状态设置为“未更改”或“已修改”。

我该如何解决?

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    您的 pro 对象已经从上下文中加载,并且它被 EF 跟踪。在 Update 方法中将其状态更改为 modified 是多余的,因此会出现此错误。

    因此,您可以跳过 Update 方法中更改状态的代码,

    或者注释掉以下几行,因为无论如何你都是从viewModel构建你的实体

    repository = new Repository();
    var pro = repository.FindProductById(viewModel.Id);
    

    通常;如果一个对象已经从上下文中加载,不要附加它 如果它是在上下文之外创建的,请将其状态设置为已修改。

    一本好书 - https://msdn.microsoft.com/en-us/data/jj592676.aspx

    【讨论】:

    • @komeilshahmoradi - 您可以注释掉上面的行。接下来构建您的pro 实体(您已经在做),确保它具有与视图模型中相同的Id。保持Update 方法不变。这应该工作
    • @komeilshahmoradi - 您能否分享您遇到的错误以及新代码?
    【解决方案2】:

    添加此行用于更新和保存:

      using (var Context = new MobileDatabase_1_Entities())
      {
        Context.Entry(pro).State = EntityState.Modified;
        Context.SaveChanges();
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多