由於外鍵關係,刪除某些實體時出現問題。我理解以下錯誤消息,並且一直在做的一切我能想到的刪除實體,而不會產生這樣的錯誤:使用外鍵關係刪除實體的實體框架錯誤
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