由于外键关系,删除某些实体时出现问题。我理解以下错误消息,并且一直在做的一切我能想到的删除实体,而不会产生这样的错误:使用外键关系删除实体的实体框架错误
The DELETE statement conflicted with the REFERENCE constraint "FK_QuizUserAnswer_QuizWithQuestion". The conflict occurred in database "SomeDatabase", table "dbo.QuizUserAnswer", column 'idQuizQuestion'. The statement has been terminated.
这里是有问题的两个表的图像:
我试图删除QuizWithQuestion实体。我已经制作了idQuizQuestion列,可以为空。所以,QuizUserAnswer端的外键是可空的。 在映射文件中,我指定的关系是可选:
HasMany(t => t.QuizUserAnswers)
.WithOptional(t => t.QuizWithQuestion)
.HasForeignKey(t => t.idQuizQuestion);
HasOptional(t => t.QuizWithQuestion)
.WithMany(t => t.QuizUserAnswers)
.HasForeignKey(d => d.idQuizQuestion);
我已经尝试了很多代码,很多片段,所以我会后,希望我的意图的代码的当前状态很清楚:
public void RemoveQuestionsFromQuiz(IEnumerable<int> deletedQuestions, int quizId)
{
var quiz = // code which retrieves quiz
foreach (var deletedQuestion in deletedQuestions)
{
var quizWithQuestion = quiz.QuizWithQuestions.FirstOrDefault(q => q.Id == deletedQuestion);
if (!ReferenceEquals(null, quizWithQuestion))
{
db.Entry(quizWithQuestion).State = EntityState.Deleted;
}
}
db.SaveChanges();
}
的另一种尝试是这样的:
public void RemoveQuestionsFromQuiz(IEnumerable<int> deletedQuestions, int quizId)
{
var quiz = // code which retrieves quiz
foreach (var deletedQuestion in deletedQuestions)
{
var quizWithQuestion = quiz.QuizWithQuestions.FirstOrDefault(q => q.Id == deletedQuestion);
if (!ReferenceEquals(null, quizWithQuestion))
{
foreach (var quizUserAnswer in quizWithQuestion.QuizUserAnswers)
{
quizUserAnswer.idQuizQuestion = null; // nullable
quizWithQuestion.QuizUserAnswers.Remove(quizUserAnswer);
db.Entry(quizUserAnswer).State = EntityState.Modified;
}
quiz.QuizWithQuestions.Remove(quizWithQuestion);
db.Entry(quizWithQuestion).State = EntityState.Deleted;
}
}
_db.SaveChanges();
}
我怎样才能删除这些混账耳鼻喉科ities(我很接近写一个存储过程)?
该例外表示该问题不能被删除,因为存在引用该问题的用户答案(不是很多单词)。您正在删除测验,测验中的问题,但是您是否打算删除针对问题的问题(听起来很糟糕)。还是应该以非规范化的方式存储答案而不使用外键? – Smudge202
你为什么要设置输入状态?这些实体是否开始分离?如果他们已经连接,很多线条看起来多余。 – jjj
@ Smudge202我确实希望能够删除QuizWithQuestion,但离开孤儿QuizUserAnswer。通过一个可为空的外键,我应该能够做到这一点。我不明白为什么它不允许我这样做。 – onefootswill