Entity Framework: невозможно сохранить данные из-за отслеживания - PullRequest
0 голосов
/ 10 февраля 2019

У меня сложный класс.Обратная связь и шаги.Я использую базу данных SQL и .Net Core 2. Я могу сохранить основные свойства, но не могу сохранить свойства подкласса FeedbackSteps

public class FeedbackModel
{
    [Key]
    public int FeedBackID { get; set; }
    public DateTime FBDate { get; set; }
    public bool? VideoStatus { get; set; }
    public string VideoDetail { get; set; }
    public string PITFeedBack { get; set; }
    public int ActivityID { get; set; }
    public virtual ActivityModel Activity { get; set; }
    public int ClientID { get; set; }
    public virtual ClientModel Client { get; set; }
    public int? SupportPlanID { get; set; }
    public virtual SupportPlanModel SupportPlan { get; set; }
    public int EmployeeID { get; set; }
    public virtual Employee Employee { get; set; }
    public bool FeedbackStatus { get; set; } = true;

    virtual public List<FeedbackStepModel> FeedbackSteps { get; set; }
}

и

public class FeedbackStepModel
{
    [Key]
    public int FeedbackStepID { get; set; }
    public int FeedbackID { get; set; } = 0;
    public int SupportPlanID { get; set; }    
    public int StepNumber { get; set; }
    public string StepDetail { get; set; }
    public string AchivmentStatus { get; set; }
    public string AchivmentComment { get; set; }

}

Это метод записи,Просмотр возвращает Отредактированный или Обновленный отзыв, и я просто хочу обновить базу данных новыми данными

    [HttpPost]
    public IActionResult Edit(FeedbackModel feedback)
    {
        if (ModelState.IsValid)
        {
            feedbackRepository.Save(feedback);
            TempData["message"] = $"Feedback has been saved";
            return RedirectToAction("Index");
        }
    }

после РЕДАКТИРОВАТЬ, я хотел бы сохранить ее ...

    public void Save(FeedbackModel feedback)
    {
        if (feedback.FeedBackID == 0)
        {
            context.FeedbackModels.Add(feedback);
        }
        else
        {
            FeedbackModel dbEntry = context.FeedbackModels.Include(s => s.FeedbackSteps).FirstOrDefault(a => a.FeedBackID == feedback.FeedBackID);

            if (dbEntry != null)
            {
                dbEntry.FeedBackID = feedback.FeedBackID;
                dbEntry.FBDate = feedback.FBDate;
                dbEntry.VideoStatus = feedback.VideoStatus;
                dbEntry.VideoDetail = feedback.VideoDetail;
                dbEntry.SupportPlanID = feedback.SupportPlanID;
                dbEntry.ActivityID = feedback.ActivityID;
                dbEntry.PITFeedBack = feedback.PITFeedBack;
                dbEntry.ClientID = feedback.ClientID;
                dbEntry.EmployeeID = feedback.EmployeeID;                   
                dbEntry.FeedbackStatus = feedback.FeedbackStatus;
                dbEntry.FeedbackSteps = feedback.FeedbackSteps;
            }
        }
        context.SaveChanges();
    }

Но это даетмне эта ошибка все время

Message=The instance of entity type 'FeedbackStepModel' cannot be tracked because another instance with the key value '{FeedbackStepID: 1}' is already being tracked. 
When attaching existing entities, ensure that only one entity instance with a given key value is attached.

1 Ответ

0 голосов
/ 10 февраля 2019

Ваша FeedbackModel операция обновления для детей (FeedbackSteps) должна быть следующей:

FeedbackModel dbEntry = context.FeedbackModels.Include(s => s.FeedbackSteps).FirstOrDefault(a => a.FeedBackID == feedback.FeedBackID);

if (dbEntry != null)
{
      dbEntry.FeedBackID = feedback.FeedBackID;
      dbEntry.FBDate = feedback.FBDate;
      dbEntry.VideoStatus = feedback.VideoStatus;
      dbEntry.VideoDetail = feedback.VideoDetail;
      dbEntry.SupportPlanID = feedback.SupportPlanID;
      dbEntry.ActivityID = feedback.ActivityID;
      dbEntry.PITFeedBack = feedback.PITFeedBack;
      dbEntry.ClientID = feedback.ClientID;
      dbEntry.EmployeeID = feedback.EmployeeID;                   
      dbEntry.FeedbackStatus = feedback.FeedbackStatus;

      dbEntry.FeedbackSteps.Clear(); // First you have to clear the existing feedBackSteps

      foreach(FeedbackStep feedBackStep in feedback.FeedbackSteps)
      {
         dbEntry.FeedbackSteps.Add(feedBackStep); // You have to add new and updated feedBackStep here.
      }
}

Если dbEntry.FeedbackSteps.Clear(); не работает (может быть в EF Core 2.0 или ниже Clear() работаетне работает) затем замените dbEntry.FeedbackSteps.Clear(); на следующий код:

foreach(FeedbackStep feedbackStepToBeRemoved in dbEntry.FeedbackSteps)
{
   context.Remove(feedbackStepToBeRemoved);
}
...