实体框架错误删除具有外键关系的实体

one*_*ill 3 entity-framework poco entity-framework-6

由于外键关系,我在删除某些实体时遇到问题。我了解以下错误消息,并已尽我所能删除实体而不会导致此错误:

DELETE 语句与 REFERENCE 约束“FK_QuizUserAnswer_QuizWithQuestion”冲突。冲突发生在数据库“SomeDatabase”、表“dbo.QuizUserAnswer”、“idQuizQuestion”列中。该语句已终止。

这是有问题的两个表的图像:

在此处输入图片说明

我正在尝试删除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);
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多很多代码片段,所以我将发布代码的当前状态,希望我的意图是明确的:

    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();
    }
Run Code Online (Sandbox Code Playgroud)

另一种尝试如下所示:

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();
}
Run Code Online (Sandbox Code Playgroud)

如何删除这些该死的实体(我已经快要编写存储过程了)?

jjj*_*jjj 8

由于您已经有要删除的问题 ID,因此应该可以使用以下方法:

// 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();
Run Code Online (Sandbox Code Playgroud)

如果QuizUserAnswer实体被加载到上下文中(这就是 include 应该做的),实体框架应该处理将外键设置为 null。