EntityFramework вставляет и обновляет одновременно

#asp.net #frameworks #entity

#asp.net #фреймворки #сущность

Вопрос:

Я использую Entity Framework 4, и когда я пытаюсь обновить существующую запись, она обновляет и вставляет новую запись с теми же значениями.

     public void UpdateEmployeeEvaluationResponse(long empId, long evalId, long QuestID, string responseStr)
    {
        var currentResponse = this.LoadResponseByEvaluationIdAndQuestionIdAndEmployeeId(evalId,
                  QuestID, empId);

      // response.ID = currentResponse.ID;
        //currentResponse.ResponseDate = response.ResponseDate;
        currentResponse.Response = responseStr;
      // entities.ObjectStateManager.GetObjectStateEntry(response).SetModified();
      // entities.EmployeeEvaluationResponses.Attach(response);
      //// entities.ObjectStateManager.ChangeObjectState(currentResponse, System.Data.EntityState.Modified);
      // //entities.EmployeeEvaluationResponses.ApplyCurrentValues(response);

        ObjectStateEntry osmEntry = entities.ObjectStateManager.GetObjectStateEntry(currentResponse);
        osmEntry.ChangeState(EntityState.Modified);

      // //entities.ObjectStateManager.GetObjectStateEntry(currentResponse).SetModified();

        // //entities.Refresh(RefreshMode.ClientWins, currentResponse);
    //    entities.Detach(currentResponse);
       entities.SaveChanges();
    }
  

это реализация метода load

     public EmployeeEvaluationResponse LoadResponseByEvaluationIdAndQuestionIdAndEmployeeId(long evaluationId,
                                                                                           long questionResponseId,
                                                                                           long employeeId)
    {
        return entities.EmployeeEvaluationResponses.Include("Employee").Include("Evaluation").Include
            ("QuestionResponse").Where(x => x.Evaluation.ID == evaluationId amp;amp;
                 x.QuestionResponse.ID == questionResponseId amp;amp;
                 x.Employee.Id == employeeId).FirstOrDefault();
    }
  

Привет, я решил это ==> проблема заключалась в том, что из других применений есть некоторые кэшированные объекты, поэтому
Я создал код для отсоединения всех объектов, и это работает … Да … и прокомментировал другое решение

    public void UpdateEmployeeEvaluationResponse(long empId, long evalId, long QuestResponseID, string responseStr)
    {
        foreach (var item in entities.EmployeeEvaluationResponses)
        {
            entities.EmployeeEvaluationResponses.Detach(item);
        }
        var currentResponse = this.LoadResponseByEvaluationIdAndQuestionIdAndEmployeeId(evalId,
                 QuestResponseID, empId);
        currentResponse.Response = responseStr;
        entities.DetectChanges();
        entities.SaveChanges();
        //using (AttendanceEntities entity = new AttendanceEntities())
        //{
        //    EmployeeEvaluationResponse responseObj =
        //        entity.EmployeeEvaluationResponses.Where(x => x.Evaluation.ID == evalId amp;amp;
        //            x.QuestionResponse.ID == QuestResponseID amp;amp; x.Employee.Id == empId).FirstOrDefault();

        //    responseObj.Response = responseStr;
        //    entity.DetectChanges();
        //    entity.SaveChanges();
        //}
    }
  

Комментарии:

1. Можете ли вы показать реализацию метода loadresponsebyevaluationid, QuestionID и EmployeeID, поскольку я думаю, что он содержит проблему

2. В таблице EmployeeEvaluationResponses есть 3 внешних ключа для других 3 таблиц Employee amp; Evaluation amp; Questionresponse . Пожалуйста, убедитесь, что связь между этими 4 таблицами отображена правильно.

3. да, это отображено правильно