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.

Другие вопросы по тегам