c# – 附加类型的实体失败,因为同一类型的另一个实体已经具有相同的主键值.

前端之家收集整理的这篇文章主要介绍了c# – 附加类型的实体失败,因为同一类型的另一个实体已经具有相同的主键值.前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我快速描述我的问题.

我有5个客户的5个数据库,每个数据库都有一个名为SubnetSettings的表.

我已经创建了一个下拉列表来选择一个客户,并将显示属于所选客户的SubnetSetting表,并允许我创建,编辑和删除.

我可以创建,删除没有问题,但当我想编辑数据时,它会带来错误

‘/ TMS’应用程序中的服务器错误.

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

这是我的控制器中的编辑

  1. // GET: /SubnetSettings/Edit1/5
  2. public ActionResult Edit1(short? id)
  3. {
  4. if (id == null)
  5. {
  6. return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
  7. }
  8. SubnetSettings subnetsettings = detailView.SubnetSettings.SingleOrDefault(t => t.Id == id);
  9. if (subnetsettings == null)
  10. {
  11. return HttpNotFound();
  12. }
  13. return View(subnetsettings);
  14. }
  15.  
  16.  
  17. // POST: /SubnetSettings/Edit1/5
  18. [HttpPost]
  19. [ValidateAntiForgeryToken]
  20. public ActionResult Edit1([Bind(Include = "Id,Name,fDialUp,fPulse,fUseExternalGSMModem,fGsmDialUp,bUploadMethodId")] SubnetSettings subnetsettings)
  21. {
  22. if (ModelState.IsValid)
  23. {
  24. templateDb2.Save(subnetsettings);
  25. return RedirectToAction("Index");
  26. }
  27. return View(subnetsettings);
  28. }

这是EF中的Save方法

  1. public SubnetSettings Save(SubnetSettings subnetsettings) {
  2.  
  3. if (subnetsettings.Id == 0){
  4. context.SubnetSettings.Add(subnetsettings);
  5. }
  6. else {
  7.  
  8. context.SubnetSettings.Attach(subnetsettings);
  9. context.Entry(subnetsettings).State = EntityState.Modified;
  10. }
  11. context.SaveChanges();
  12. return subnetsettings;
  13. }

我知道很难理解其他人的代码.所以任何建议或建议都非常感谢.

解决方法

客观地综合答案:
您尝试更新的对象不是来自基础,这是错误的原因.该对象来自View的帖子.

解决方案是从base检索对象,这将使Entity Framework知道并管理上下文中的对象.然后,您必须从View中获取已更改的每个值,并包含在Entity控制的对象中.

  1. // POST: /SubnetSettings/Edit1/5
  2. [HttpPost]
  3. [ValidateAntiForgeryToken]
  4. public ActionResult Edit1([Bind(Include = "Id,bUploadMethodId")] SubnetSettings subnetsettings)
  5. {
  6. if (ModelState.IsValid)
  7. {
  8. //Retrieve from base by id
  9. SubnetSettings objFromBase = templateDb2.GetById(subnetsettings.Id);
  10.  
  11. //This will put all attributes of subnetsettings in objFromBase
  12. FunctionConsist(objFromBase,subnetsettings)
  13.  
  14. templateDb2.Save(objFromBase);
  15. //templateDb2.Save(subnetsettings);
  16.  
  17. return RedirectToAction("Index");
  18. }
  19. return View(subnetsettings);
  20. }

猜你在找的C#相关文章