我的代码中有错误,我检查了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;
}
}
}
我收到以下错误:“只有当属性的当前值为null时才能设置EntityKey属性。” 在控制器中,我在“for”循环中使用对象创建,因此应该为每个循环重新创建对象。但是,为什么我会得到以下行中已经设置了EntityKey属性的错误: public void AddTouser_answers(user_answers user_answers) { base.AddObject(“user_answers”,user_answers); } 是不是每个循环都重新创建了对象?是不是因为这句话:“使用(SWSSEntities _db = new SWSSEntities())”
Stackoverflow中讨论了一个着名的错误:“实体对象不能被多个ientitychangetracker实例引用”。 我很好奇这两行, UserAnswerRepository useransrepo = new UserAnswerRepository(); MiscDBRepository miscrepo = new MiscDBRepository(); 没有抛出那个错误。那是为什么?
我该如何解决这个问题?
我尝试从存储库中删除“using(SWSSEntities _db = new SWSSEntities())”语句并在每个中创建实体上下文。然后抛出问题2中的上述错误。因此,“使用(SWSSEntities _db = new SWSSEntities())”在两个存储库实例化之间正确地绑定和解除我的实体(如果我错了,请纠正我)。 如果我是对的,为什么它不会对“问题1”(连续实例化同一个存储库)中的错误做同样的事情。
是因为UserAnswerRepository正在保存到DB而另一个正在读取吗?
我很困惑。我是.NET C#和整个Entity Framework的新手。所以请原谅,如果我是愚蠢的。
DB Schema: