2015-05-20 74 views
1

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

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.

這裏是有問題的兩個表的圖像:

enter image description here

我試圖刪除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(我很接近寫一個存儲過程)?

+1

該例外表示該問題不能被刪除,因爲存在引用該問題的用戶答案(不是很多單詞)。您正在刪除測驗,測驗中的問題,但是您是否打算刪除針對問題的問題(聽起來很糟糕)。還是應該以非規範化的方式存儲答案而不使用外鍵? – Smudge202

+0

你爲什麼要設置輸入狀態?這些實體是否開始分離?如果他們已經連接,很多線條看起來多餘。 – jjj

+0

@ Smudge202我確實希望能夠刪除QuizWithQuestion,但離開孤兒QuizUserAnswer。通過一個可爲空的外鍵,我應該能夠做到這一點。我不明白爲什麼它不允許我這樣做。 – onefootswill

回答

3

既然你已經有問題的IDS進行刪除,這樣的事情應該工作:

// assuming db is your DbContext 
var questions = db.QuizWithQuestions 
        .Where(q => deletedQuestions.Contains(q.Id)) 
        .Include(q => q.QuizUserAnswers); 

// assuming this is your DbSet 
db.QuizWithQuestions.RemoveRange(questions); 

db.SaveChanges(); 

如果QuizUserAnswer實體被加載到上下文(這是包括應該做的),實體框架應處理設置外鍵爲空。

+0

踢自己。我忘了**包括**。森林的樹木。我知道這會很簡單。 – onefootswill