gpt4 book ai didi

entity-framework - Entity Framework 错误删除具有外键关系的实体

转载 作者:行者123 更新时间:2023-12-04 08:29:21 25 4
gpt4 key购买 nike

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

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();
}

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

最佳答案

由于您已经有了要删除的问题 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 应该做的), Entity Framework 应该处理将外键设置为 null。

关于entity-framework - Entity Framework 错误删除具有外键关系的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30351762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com