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

C# Net MVC核心-实体类型'';无法跟踪,因为已跟踪具有相同密钥的此类型的另一个实例,c#,asp.net,asp.net-core-mvc,entity-framework-5,C#,Asp.net,Asp.net Core Mvc,Entity Framework 5,我对使用实体框架ASP.NETMVC核心是一个新手。我习惯于编写存储过程,并将其用于数据操作,如CRUD功能 这是控制器中的代码 [HttpPost] public IActionResult SaveHeight([FromBody] IEnumerable<VisitVitalSignInfo> height) { var errMsg = string.Empty; var triageId =

我对使用实体框架ASP.NETMVC核心是一个新手。我习惯于编写存储过程,并将其用于数据操作,如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 });
        }
这是接口服务

  public interface IPatientService
    {

        void AddVisitVitalSignInfo(VisitVitalSignInfo height);
        void UpdateVisitVitalSignInfo(VisitVitalSignInfo height);
    }
  • 我已经删除了其他声明
这是主要服务

 public void UpdateVisitVitalSignInfo(VisitVitalSignInfo height)
        {

            _visitVitaSignInfo.Update(height);
        }

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

我以前没有看到过此错误,但我注意到,当您通过Id检查实体是否存在时,您将其分配给
heightData
变量。但是,当您尝试执行更新时,您传递的是
项目
,而不是
高度数据
。我过去解决这个问题的一种方法是将
item
中的值分配给
heightData
并调用

  [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(heightData);
_patient.SaveVisitVitalSignList();

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