Понимание времени существования контекста сущности
У меня есть ошибка в моем коде, и я проверил несколько связанных ошибок в Stackru и их решение. Тем не менее, я не мог понять несколько концепций.
Прежде всего это раздел кода, в котором появляется ошибка:
контроллер:
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:
Я получаю следующую ошибку: "Свойство EntityKey можно установить, только если текущее значение свойства равно нулю". В контроллере я использую создание объекта внутри цикла for, поэтому объект должен создаваться заново для каждого цикла. Однако почему я получаю ошибку, что свойство EntityKey уже установлено в следующих строках: public void AddTouser_answers(user_answers user_answers) { base.AddObject("user_answers", user_answers); } Разве объект не создается заново для каждого цикла? Это из-за этого утверждения: "using (SWSSEntities _db = new SWSSEntities())"
Вопрос 2:
В Stackru обсуждается известная ошибка: "на объект сущности нельзя ссылаться несколькими экземплярами ientitychangetracker". Мне любопытно, что эти две строки, UserAnswerRepository useransrepo = new UserAnswerRepository(); MiscDBRepository miscrepo = new MiscDBRepository(); не бросил эту ошибку. Это почему?
Вопрос 3:
Как мне решить эту проблему?
Мои эксперименты:
Я попытался удалить оператор "using (SWSSEntities _db = new SWSSEntities ())" из репозиториев и создал контекст сущности в каждом из них. Затем вышла ошибка в вопросе 2. Итак, "using (SWSSEntities _db = new SWSSEntities())" правильно связывает и развязывает мою сущность (исправьте меня, если я ошибаюсь) между экземплярами двух репозиториев. Если я прав, почему бы не сделать то же самое для ошибки в "Вопросе 1" (последовательное создание одного и того же хранилища).
Это потому, что UserAnswerRepository сохраняет в БД, а другой только читает?
Я сбит с толку. Я довольно новичок в.NET C# и всей этой вещи Entity Framework. Так что прошу прощения, если я был глупым.
Схема БД: