У меня возникла проблема с удалением некоторых объектов из-за отношения внешнего ключа. Я понимаю следующее сообщение об ошибке, и делал все, что я могу думать, чтобы удалить объекты, не подвергаясь эту ошибку:Ошибка Entity Framework Удаление сущности с внешним ключом
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.
Вот изображение из двух таблиц в вопросе:
Я пытаюсь удалить QuizWithQuestion объектов. Я сделал столбец idQuizQuestion nullable. Таким образом, внешний ключ недействителен на стороне 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();
}
Как я могу удалить эти штопать оздействию (я настолько близок к написанию хранимой процедуры)?
Исключение говорит, что вопрос не может быть удален, поскольку есть ответы пользователей, ссылающиеся на вопрос (не так много слов). Вы удаляете викторину, вопросы по викторине, но планируете ли вы также удалять вопросы по этим вопросам (это звучит плохо). Или вы должны хранить ответы денормализованным образом без внешних ключей? – Smudge202
Почему вы устанавливаете состояния записи? Разве организации начинают отключать? Если они уже подключены, многие строки кажутся излишними. – jjj
@ Smudge202 Я хочу, чтобы иметь возможность удалить QuizWithQuestion, но оставить осиротевший QuizUserAnswer. Имея нулевой внешний ключ, я должен это сделать. Я не понимаю, почему это не позволит мне это сделать. – onefootswill