【问题标题】:"An entity object cannot be referenced by multiple instances of IEntityChangeTracker in C#"“一个实体对象不能被 C# 中的多个 IEntityChangeTracker 实例引用”
【发布时间】:2012-09-21 08:38:12
【问题描述】:

在这方面需要帮助。 我需要在控制器操作中将会话中的一些数据保存到数据库中。但我得到“一个实体对象不能被 C# 中 IEntityChangeTracker 的多个实例引用”错误 answer.Add(answer);

谁能帮我解决这个问题?

Questionare questionare = unitOfWork.QuestionareRepository.GetByID(id);



            SADEntitiesContext db = new SADEntitiesContext();

            foreach (Question question in questionare.Questions)
            {
                //check if there are data in Session and save it
                _question = "question"+question.QuestionID.ToString();


                if (Session[_question] != null)
                {

                    var answer = new Answers();
                    if (TryUpdateModel(answer))
                    {

                    questionanswer = (QuestionAnswerData)Session[_question];
                    int qID = Int16.Parse(questionanswer.QuestionID);
                    var answertoupdate = answer.GetAnswer(qID, questionanswer.UserID, questionanswer.EmployeID);


                    //db.Answers.Remove(answertoupdate);


                    answer.UserName = questionanswer.UserID;
                    answer.Answer = db.AnswerChoices.Find(Int16.Parse(questionanswer.AnswerID));
                    answer.AnsweredAt = DateTime.Now;
                    answer.locked = false;
                    answer.Question = question;
                    answer.Questionare = questionare;
                    if (questionanswer.EmployeID != null)
                    {
                        answer.AnswerAboutUser = questionanswer.EmployeID;
                    }
                    if (answertoupdate != null)
                    {
                        answertoupdate = answer;

                        ok = (answertoupdate.Save() > 0);
                    }

                    else
                    {
                        answer.Add(answer);


                        ok = (answer.Save() > 0);
                    }
                    }
                }

答案类 公开课答案 {

    SADEntitiesContext db = new SADEntitiesContext();

    public int AnswersId { get; set; }

    //[Display(Name = "DataResposta", ResourceType = typeof(Resources))]
    public DateTime AnsweredAt { get; set; }

    //[Display(Name = "bloqueado", ResourceType = typeof(Resources))]
    public bool locked { get; set; }

   // [Display(Name = "UserName", ResourceType = typeof(Resources))]
    public string UserName { get; set; }

    //[Display(Name = "AnswersAboutUser", ResourceType = typeof(Resources))]
    public string AnswerAboutUser { get; set; } 

    //[Display(Name = "Resposta", ResourceType = typeof(Resources))]
    public virtual AnswerChoices Answer { get; set; } 

    //[Display(Name = "Questionare", ResourceType = typeof(Resources))]
    public virtual Questionare Questionare { get; set; }

    //[Display(Name = "QuestionID", ResourceType = typeof(Resources))]
    public virtual Question Question { get; set; }


    //
    // Persistence 

    public int Save()
    {
        return db.SaveChanges();
    }


    public Answers GetAnswer(int questionID, string employeID, string userID)
    {
        return db.Answers 
            .Where(e => e.UserName == userID
                                             && e.Question.QuestionID == questionID
                                             && e.AnswerAboutUser == employeID)

                                         .FirstOrDefault();

    }

    public Answers GetAnswer(int id)
    {
        return db.Answers.SingleOrDefault(d => d.AnswersId == id);
    }

    //
    // Insert/Delete Methods

    public void Add(Answers _answer)
    {
        db.Answers.Add(_answer);
        db.SaveChanges();
    }
}

}

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    您的问题是您正在从一个上下文中调用答案:

    answer.Answer = db.AnswerChoices.Find(Int16.Parse(questionanswer.AnswerID));
    

    然后尝试在您的 Answer 类中使用不同的方法保存它:

      SADEntitiesContext db = new SADEntitiesContext();
    

    解决您的问题的最快方法是能够在您的 Answer 类中设置上下文,这样您就不会跳转上下文,或者您可以在第一次从数据库中提取答案后分离答案,然后重新附加它在保存。

    但是,我认为您有一个更根本的问题。您确定让一个类能够创建自己的上下文并保存自己是个好主意吗?你到处都会遇到这样的问题。

    【讨论】:

    • 好的,开始吧,从类中删除所有内容,并在控制器中使用相同的上下文设置所有内容。
    猜你喜欢
    • 2011-11-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多