Entity Framework Ошибка удаления объекта с отношением внешнего ключа
У меня проблема с удалением некоторых объектов из-за связи с внешним ключом. Я понимаю следующее сообщение об ошибке и делаю все возможное, чтобы удалить объекты без возникновения этой ошибки:
Оператор 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);
Я перепробовал много, много фрагментов кода, поэтому я опубликую текущее состояние кода в надежде, что мое намерение ясно:
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();
}
Как я могу удалить эти проклятые сущности (я так близок к написанию хранимой процедуры)?
1 ответ
Поскольку у вас уже есть идентификаторы вопросов для удаления, должно сработать что-то вроде этого:
// 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.