Это связано с известной ошибкой в AddOrUpdate
.Вот что происходит.
Начальная ситуация такова, что у вас уже есть вопросы и ответы в базе данных.
Первый AddOrUpdate
...
context.Questions.AddOrUpdate(a => a.Id, question1, question2,...
... находит вопросы и прикрепляет их к контексту как UnChanged
.Однако фактически найденные экземпляры не совпадают с question1, question2,...
.Найденные экземпляры - это новые объекты, которые скрыты внутри контекста.Экземплярами question1, question2,...
являются Detached
!
Следовательно, оператор ...
context.Answers.Find(answer1.Id).Question = question1;
... соединяет answer1
с экземпляром вопроса, который является совершенно новым для контекста.После утверждения question1
состояние Added
и SaveChanges
попытаются вставить новый вопрос в существующий Id
.
Вы уже были близки к исправлению.Похоже, вы в какой-то степени знали об этой проблеме, потому что вы уже используете context.Answers.Find(answer1.Id)
.Этот оператор извлекает скрытую копию answer1
из кэша контекста, поэтому EF не видит эту как новую.Исправление заключается в том, чтобы сделать то же самое с вопросами:
question1 = context.Questions.Find(question1.Id);
question2 = context.Questions.Find(question2.Id);
context.Answers.Find(answer1.Id).Question = question1;
context.Answers.Find(answer2.Id).Question = question2;
context.SaveChanges();