我正在尝试使用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
顺便说一句,对我看到的类似问题的其他修复没有帮助,我尝试了加载。
答案 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。