Entity framework 实体框架删除具有外键关系的实体时出错

Entity framework 实体框架删除具有外键关系的实体时出错,entity-framework,entity-framework-6,poco,Entity Framework,Entity Framework 6,Poco,由于外键关系,我在删除某些实体时遇到问题。我理解以下错误消息,并已尽我所能删除实体,而不会导致此错误: DELETE语句与引用约束冲突 “FK_QuizUserAnswer_QuizWithQuestion”。冲突发生在 数据库“SomeDatabase”,表“dbo.QuizUserAnswer”,第列 “idQuizQuestion”。声明已终止 下面是两张有问题的表格的图像: 我正在尝试删除QuizWithQuestion实体。我已将idQuizQuestion列设置为可空。因此,外键在

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

DELETE语句与引用约束冲突 “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);
我已经尝试了很多很多代码片段,因此我将发布代码的当前状态,希望我的意图是明确的:

    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 removequestions fromquick(IEnumerable deletedQuestions,int quizId)
{
var quick=//检索测验的代码
foreach(deletedQuestions中的var deletedQuestion)
{
var quizWithQuestion=quick.QuizWithQuestions.FirstOrDefault(q=>q.Id==deletedQuestion);
如果(!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();
}
public void removequestions fromquick(IEnumerable deletedQuestions,int quizId)
{
var quick=//检索测验的代码
foreach(deletedQuestions中的var deletedQuestion)
{
var quizWithQuestion=quick.QuizWithQuestions.FirstOrDefault(q=>q.Id==deletedQuestion);
如果(!ReferenceEquals(null,quizWithQuestion))
{
foreach(quizWithQuestion.QuizUserAnswers中的var quizUserAnswer)
{
quizUserAnswer.idQuizQuestion=null;//可为null
quizWithQuestion.QuizUserAnswers.Remove(quizUserAnswer);
db.Entry(quizUserAnswer).State=EntityState.Modified;
}
quick.QuizWithQuestions.Remove(quizWithQuestion);
db.Entry(quizWithQuestion).State=EntityState.Deleted;
}
}
_db.SaveChanges();
}

我如何删除这些该死的实体(我差一点就要写存储过程了)

由于您已经有了要删除的问题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();

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

异常表示无法删除该问题,因为有用户答案引用该问题(不是用这么多词)。你正在删除测验,测验中的问题,但是你是否也计划删除针对问题的问题(听起来很糟糕)。或者您应该以非规范化的方式存储答案而不使用外键?为什么要设置输入状态?实体从分离开始吗?如果它们已经附加,那么许多行似乎是多余的。@Smudge202我确实希望能够删除QuizWithQuestion,但留下孤立的QuizUserAnswer。通过使用可为空的外键,我应该能够做到这一点。我不明白为什么它不允许我这么做。@jjj我只关心删除实体。我不介意在这个阶段是否有大量的红色线条。有些是冰雹玛丽的。我只想把工作做完,踢我自己。我忘了把它放在前面。以林换树。我知道这很简单。