ASP.NET MVC JQUERY附加类型的实体失败,因为同一类型的另一个实体已具有相同的主键值

时间:2018-02-01 09:16:12

标签: c# jquery asp.net asp.net-mvc entity-framework

我正在尝试使用jquery执行操作,当按下按钮时它会更改该数据库中的值。

我的代码:

按钮:

<a class="fa fa-2x fa-check confirmAnswer" href="#" onclick="Confirm(@item.ID)"></a>

JS:

    var Confirm = function (solutionID) {

    $.ajax({
        type: "POST",
        url: "/Help/ConfirmSolution",
        data: { id: solutionID },
        success: function (response) {
            alert("Survey Deleted");
            location.reload();
        },

    })
}

控制器操作:

    [HttpPost]
    public JsonResult ConfirmSolution(int id)
    {
        HelpSolutionViewModel answer = Mapper.Map<HelpSolution, HelpSolutionViewModel>(unitOfWork.HelpSolutionRepository.GetByID(id));
        answer.Selected = true;
        HelpSolution helpsolution = Mapper.Map<HelpSolutionViewModel, HelpSolution>(answer);
        unitOfWork.HelpSolutionRepository.Update(helpsolution);
        unitOfWork.Save();
        return Json(helpsolution, JsonRequestBehavior.AllowGet);
    }

存储库方法:

        public virtual void Update(TEntity entityToUpdate)
    {
        dbSet.Attach(entityToUpdate);
        context.Entry(entityToUpdate).State = EntityState.Modified;
    }

    public virtual TEntity GetByID(object id)
    {
        return dbSet.Find(id);
    }

错误:

  

附加类型的实体失败,因为同一类型的另一个实体已经具有相同的主键valuelockquote

顺便说一句,对我看到的类似问题的其他修复没有帮助,我尝试了加载。

3 个答案:

答案 0 :(得分:0)

默认情况下,Entity Framework会跟踪从数据库中提取的所有对象。因此,在您的GetById方法中,您将具有该id的对象附加到实体框架跟踪器。在您的更新方法尝试再次将此对象添加到实体框架,同时已跟踪具有相同ID的对象。

此解决方案是将AsNoTracking添加到您的GetById方法中。这仍将返回对象,但实体框架不会跟踪此对象。

答案 1 :(得分:0)

看起来您已将附加的条目附加到dbSet。 尝试删除此行:

dbSet.Attach(entityToUpdate);

答案 2 :(得分:0)

您根本不需要此Update方法调用,所有这些映射操作也都是多余的。

您正从数据库中提取对象。该对象已附加,因此您只需修改并保存即可。

var helpsolution = unitOfWork.HelpSolutionRepository.GetByID(id);
helpsolution.Selected = true;
unitOfWork.Save();

这会发出UPDATE语句,只会更新一个字段instead of all fields