Entity framework 实体框架删除具有外键关系的实体时出错
由于外键关系,我在删除某些实体时遇到问题。我理解以下错误消息,并已尽我所能删除实体,而不会导致此错误: DELETE语句与引用约束冲突 “FK_QuizUserAnswer_QuizWithQuestion”。冲突发生在 数据库“SomeDatabase”,表“dbo.QuizUserAnswer”,第列 “idQuizQuestion”。声明已终止 下面是两张有问题的表格的图像: 我正在尝试删除QuizWithQuestion实体。我已将idQuizQuestion列设置为可空。因此,外键在QuizUserAnswer端可以为空。 在映射文件中,我指定关系是可选的:Entity framework 实体框架删除具有外键关系的实体时出错,entity-framework,entity-framework-6,poco,Entity Framework,Entity Framework 6,Poco,由于外键关系,我在删除某些实体时遇到问题。我理解以下错误消息,并已尽我所能删除实体,而不会导致此错误: DELETE语句与引用约束冲突 “FK_QuizUserAnswer_QuizWithQuestion”。冲突发生在 数据库“SomeDatabase”,表“dbo.QuizUserAnswer”,第列 “idQuizQuestion”。声明已终止 下面是两张有问题的表格的图像: 我正在尝试删除QuizWithQuestion实体。我已将idQuizQuestion列设置为可空。因此,外键在
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我只关心删除实体。我不介意在这个阶段是否有大量的红色线条。有些是冰雹玛丽的。我只想把工作做完,踢我自己。我忘了把它放在前面。以林换树。我知道这很简单。