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)
如何删除这些该死的实体(我已经快要编写存储过程了)?
由于您已经有要删除的问题 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。
| 归档时间: |
|
| 查看次数: |
15252 次 |
| 最近记录: |