了解实体上下文生命周期

时间:2013-02-04 01:33:35

标签: asp.net entity-framework c#-4.0 asp.net-mvc-3-areas entitykey

我的代码中有错误,我检查了Stackoverflow及其解决方案中的几个相关错误。然而,我无法理解一些概念。

首先,这是出现错误的代码部分:

控制器:

public ActionResult IndexPost(IEnumerable<QuestionView> questions, string button)
        {
            foreach (QuestionView question in questions)
            {
                UserAnswerRepository useransrepo = new UserAnswerRepository();
                MiscDBRepository miscrepo = new MiscDBRepository();

                //Store user's answer
                useransrepo.CreateUserAnswer(<>);

                //Check answer against rubrics
                choiceList = miscrepo.GetChoicesAnswithQuesId(question.QuestionId);
                ....
           }
       }

数据库存储库:

public class UserAnswerRepository
    {
        //Add user answer to DB
        public void CreateUserAnswer(string sessionId, string email, int questionId, string answer)
        {
            using (SWSSEntities db = new SWSSEntities())
            {
                user_answers useranstable = new user_answers();

                AuthCodeRepository authrepo = new AuthCodeRepository();
                UserRepository userrepo = new UserRepository();
                QuestionRepository quesrepo = new QuestionRepository();

                if (sessionId == "0")
                    useranstable.authcode = authrepo.GetRecordwithEmail(email);
                else
                    //useranstable.user = userrepo.GetUser(userrepo.GetUserNameByEmail(email));
                    useranstable.question = quesrepo.GetQuestionRecordwithId(questionId);
                useranstable.answer = answer;

                db.AddTouser_answers(useranstable);
                db.SaveChanges();
            }
        }
    }

public class MiscDBRepository
    {
        //Get choices and answers for a question with questionid
        public List<string> GetChoicesAnswithQuesId(int id)
        {
            using (SWSSEntities _db = new SWSSEntities())
            {
                var list = new List<string>();
                list.Add((from d in _db.question_choices where d.question.id == id select d.choice1).First());
                list.Add((from d in _db.question_choices where d.question.id == id select d.choice2).First());
                list.Add((from d in _db.question_choices where d.question.id == id select d.choice3).First());
                list.Add((from d in _db.question_choices where d.question.id == id select d.choice4).First());
                list.Add((from d in _db.question_choices where d.question.id == id select d.answer).First());
                return list;
            }
        }
    }

问题1:

我收到以下错误:“只有当属性的当前值为null时才能设置EntityKey属性。” 在控制器中,我在“for”循环中使用对象创建,因此应该为每个循环重新创建对象。但是,为什么我会得到以下行中已经设置了EntityKey属性的错误: public void AddTouser_answers(user_answers user_answers)         {             base.AddObject(“user_answers”,user_answers);         } 是不是每个循环都重新创建了对象?是不是因为这句话:“使用(SWSSEntities _db = new SWSSEntities())”

问题2:

Stackoverflow中讨论了一个着名的错误:“实体对象不能被多个ientitychangetracker实例引用”。 我很好奇这两行, UserAnswerRepository useransrepo = new UserAnswerRepository(); MiscDBRepository miscrepo = new MiscDBRepository(); 没有抛出那个错误。那是为什么?

问题3:

我该如何解决这个问题?

我的实验:

我尝试从存储库中删除“using(SWSSEntities _db = new SWSSEntities())”语句并在每个中创建实体上下文。然后抛出问题2中的上述错误。因此,“使用(SWSSEntities _db = new SWSSEntities())”在两个存储库实例化之间正确地绑定和解除我的实体(如果我错了,请纠正我)。 如果我是对的,为什么它不会对“问题1”(连续实例化同一个存储库)中的错误做同样的事情。

是因为UserAnswerRepository正在保存到DB而另一个正在读取吗?

我很困惑。我是.NET C#和整个Entity Framework的新手。所以请原谅,如果我是愚蠢的。

DB Schema:

enter image description here

0 个答案:

没有答案