ASP.Net MVC核心 - 实体类型的实例''无法跟踪,因为已经跟踪了具有相同密钥的此类型的另一个实例

时间:2017-07-27 03:29:10

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

我是使用Entity Framework ASP.Net MVC Core的新手。我习惯于编写存储过程并使用它来调用它来进行数据操作,例如CRUD功能。

这是控制器中的代码

  [HttpPost]
        public IActionResult SaveHeight([FromBody] IEnumerable<VisitVitalSignInfo> height)
        {
            var errMsg = string.Empty;
            var triageId = 0;
            try
            {
                if (ModelState.IsValid)
                {

                        foreach (var item in height)
                        {
                            var heightData = _patient.GetVisitVitalSignInfoById(item.visitVitalSignInfoId);
                            if (heightData.visitVitalSignInfoId == 0)
                            {
                                _patient.AddVisitVitalSignInfo(item);
                               _patient.SaveVisitVitalSignList();
                               triageId = item.triageId;
                        }

                            else
                            {
                                _patient.UpdateVisitVitalSignInfo(item);
                                _patient.SaveVisitVitalSignList();

                        }
                        }



                    //_patient.AddVisitVitalSignInfo(height);
                    //_patient.SaveVisitVitalSignList();
                    //visitVitalSignInfoId = height.visitVitalSignInfoId;
                    ////_clinic.AddClinic(clinic);
                    ////_clinic.SaveClinicList();
                    ////clinicId = clinic.clinicId;
                }
                else
                    errMsg = "Invalid data!";
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
            }
            return Json(new { errMsg = errMsg, triageId = triageId });
        }

要集中注意力,正在调用更新功能

_patient.UpdateVisitVitalSignInfo(item);

这是接口服务

  public interface IPatientService
    {

        void AddVisitVitalSignInfo(VisitVitalSignInfo height);
        void UpdateVisitVitalSignInfo(VisitVitalSignInfo height);
    }
  • 我已删除其他声明

这里是主要服务

 public void UpdateVisitVitalSignInfo(VisitVitalSignInfo height)
        {

            _visitVitaSignInfo.Update(height);
        }

在通过_patient.UpdateVisitVitalSignInfo(item)后出现错误;在控制器中

2 个答案:

答案 0 :(得分:0)

之前我没有看到过这个错误但是我注意到当你通过Id检查实体存在时,你将它分配给heightData变量。但是,当您尝试进行更新时,您传递的是item而不是heightData。我过去修正此问题的一种方法是将值从item分配到heightData并调用

_patient.UpdateVisitVitalSignInfo(heightData);
_patient.SaveVisitVitalSignList();

答案 1 :(得分:0)

我在这里做了一个小小的猜测,但我假设您正在更新父记录并可能在同一个电话中添加孩子?如果是这样,如果您正在为标识字段添加PK,则必须先添加子项。否则,它会认为您正在使用同一个实体两次,而不是添加两个新项目。如果你不能这样做,那么你需要先将孩子的PK设置为-1,-2等,然后再调用save。如果你有多个级别,那么也需要为他们的孩子更新PK参考。