2015-05-20 75 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