【问题标题】:Entity Framework: Can't save data because of tracking实体框架:由于跟踪而无法保存数据
【发布时间】:2019-07-04 06:21:43
【问题描述】:

我有一个复杂的课程。反馈和步骤。我正在使用 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; }

}

这是post方法。查看返回编辑或更新的反馈,我只想用新数据更新数据库

    [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.

【问题讨论】:

  • 如果你从数据库中读取你的反馈模型,它已经被跟踪了;无需将其添加到 DataContext。
  • @RobertHarvey - 但是 ID 不会是 0
  • @AliAzra,你的新 FeedbackSteps 在哪里发布?
  • @HenkHolterman:再来一次?这就是您在编辑时想要的。
  • 是的,它来自 Post

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


【解决方案1】:

您的 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);
}

【讨论】:

  • 谢谢 TanvirArjel。我试过了,但又给了我完全相同的错误。
  • 干得好坦维尔。它现在正在工作.. 非常感谢.. 还有一个问题。我有具有相同数据库和网站的类似数据模型。编码也是完全相同的代码,但它是如何工作的。我将发布带有新问题的代码。如果你有时间请看看它,并告诉我为什么它在那里工作,但不是在这里。
  • @AliAzra 很高兴听到这个消息。当然!在发布问题后提及我。
  • 谢谢,我输入了,但我需要等待 90 分钟才能发帖。
  • 好的!然后我必须在早上(我的时间)看到这个,因为在我的国家已经是 12.09 AM。
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
相关资源
最近更新 更多