Как изменить базу данных, имеющую внешний ключ в asp.net?

#asp.net #asp.net-mvc

Вопрос:

У меня есть две таблицы: SurveyOption и SurveyQuestion в моей модели базы данных.

 public class SurveyOptions
    {
        [Key]
        public Guid SurveyOptionId { get; set; }
        public Guid? SurveyQuestionId { get; set; }
        public int? Sequence { get; set; }
        [MaxLength(50)]
        public string OptionValue { get; set; }
        [MaxLength(500)]
        public string Description { get; set; }
        public Guid? ImageId { get; set; }
    }
 
 public class SurveyQuestions
    {
        [Key]
        public Guid SurveyQuestionsId { get; set; }
        public Guid? SurveyMasterId { get; set; }
        public int? Sequence { get; set; }
        [MaxLength(1)]
        public string QuestionType { get; set; }
        [MaxLength(500)]
        public string QuestionText { get; set; }
        public bool? Required { get; set; }
        public string ExplanationLink { get; set; }

    }
 

SurveyQuestionId-это внешний ключ в SurveyOption. При выполнении запроса на обновление я неоднократно получаю сообщение об ошибке The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SurveyOptions_SurveyQuestions". The conflict occurred in database "MCNITemp", table "dbo.SurveyQuestions", column 'SurveyQuestionsId'.

Моя модель просмотра опроса состоит из списка опций. В котором каждый опросный запрос содержит свой собственный список опций типа List<SurveyOption> , а список вопросов имеет тип List<SurveyQuestion> Мой код изменения следующий:

 foreach (var question in questionList)
                            {
                                var options = question.OptionsList;

                                
                                foreach (var option in options)
                                {
                                    var optionData = _mcniDbContext.SurveyOptions.Where(e => e.SurveyOptionId == option.SurveyOptionId).FirstOrDefault();
                                    if (optionData == null)
                                    {
                                        _mcniDbContext.SurveyOptions.Add(new SurveyOptions()
                                        {
                                            OptionValue = option.OptionValue,
                                            Description = option.Description,
                                            Sequence = option.Sequence,
                                            SurveyOptionId = option.SurveyOptionId,
                                            SurveyQuestionId = option.SurveyQuestionId
                                        });
                                    }
                                    else
                                    {
                                        optionData.SurveyOptionId = option.SurveyOptionId;
                                        optionData.SurveyQuestionId = option.SurveyQuestionId;
                                        optionData.Sequence = option.Sequence;
                                        optionData.OptionValue = option.OptionValue;
                                        optionData.Description = option.Description;
                                        _mcniDbContext.Entry(optionData).State = EntityState.Modified;
                                    }
                                    _mcniDbContext.SaveChanges();
                                }

                                var questionData = _mcniDbContext.SurveyQuestions.Where(e => e.SurveyQuestionsId == question.SurveyQuestionsId).FirstOrDefault();
                                questionData.SurveyQuestionsId = question.SurveyQuestionsId;
                                questionData.SurveyMasterId = surveyMasterId;
                                questionData.QuestionText = question.QuestionText;
                                questionData.QuestionType = question.QuestionType;
                                questionData.Required = question.Required;
                                _mcniDbContext.Entry(questionData).State = EntityState.Modified;
                                _mcniDbContext.SaveChanges();

                            }
 

Ответ №1:

В своей модели вы дали EF знать, как работают отношения. Предполагая, что вы не использовали Fluent Api для описания того же самого, ваш код может быть похож на приведенный ниже (код не был протестирован):

 public class SurveyOptions
{
    [Key]
    public Guid SurveyOptionId { get; set; }

    [ForeignKey("SurveyQuestionId")]
    public SurveyQuestion SurveyQuestion {get;set;}
    public Guid? SurveyQuestionId { get; set; }


    public int? Sequence { get; set; }
    [MaxLength(50)]
    public string OptionValue { get; set; }
    [MaxLength(500)]
    public string Description { get; set; }
    public Guid? ImageId { get; set; }
}