【问题标题】:Exception: Multiplicity constraint violated例外:违反多重性约束
【发布时间】:2015-02-16 01:20:50
【问题描述】:

将 Question 和 PossibleAnswer 的关系从多对多更改为一对多后,我得到一个异常:“对数据库的更改已成功提交,但在更新对象上下文时发生错误。ObjectContext 可能处于不一致状态。内部异常消息:违反多重性约束。关系“WebUI.Models.PossibleAnswer_Question”的角色“PossibleAnswer_Question_Source”具有多重性 1 或 0..1。”什么意思?

这是我的模型:

public class Question
    {
        public int ID { get; set; }
        public string Text { get; set; }
        public bool IsAssociatedWithProfessor { get; set; }
        public bool IsAssociatedWithAssistant { get; set; }

        public virtual ICollection<PossibleAnswer> PossibleAnswers { get; set; }
        public virtual ICollection<Results> Results { get; set; }
    }
public class PossibleAnswer
    {
        public int ID { get; set; }
        public string Text { get; set; }

        public virtual Question Question { get; set; }
    }

问题的视图模型(我知道 ToQuestion 应该在控制器中,我稍后会重新排列它):

public class QuestionVM
    {
        public QuestionVM() {
        }
        public QuestionVM(Question question) : this()
        {
            ID = question.ID;
            Text = question.Text;
            IsAssociatedWithProfessor = question.IsAssociatedWithProfessor;
            IsAssociatedWithAssistant = question.IsAssociatedWithAssistant;
        }
        public int? ID { get; set; }
        public string Text { get; set; }
        public bool IsAssociatedWithProfessor { get; set; }
        public bool IsAssociatedWithAssistant { get; set; }
        private IEnumerable<string> _possibleAnswers;
        public IEnumerable<string> PossibleAnswers 
        { 
            get
            {
                return _possibleAnswers ?? new List<string>(){"", "", "", "", ""};
            }
            set 
            {
                _possibleAnswers = value;
            }
        }
        public Question ToQuestion()
        {
            Question question = new Question
            {
                Text = this.Text,
                IsAssociatedWithProfessor = this.IsAssociatedWithProfessor,
                IsAssociatedWithAssistant = this.IsAssociatedWithAssistant,
                PossibleAnswers = new List<PossibleAnswer>()
            };
            //ID will be null if creating new question
            if(ID != null)
            {
                question.ID = (int) ID;
            }
            foreach (string possibleAnswer in this.PossibleAnswers)
            {
                if (!String.IsNullOrEmpty(possibleAnswer))
                {
                    question.PossibleAnswers.Add(new PossibleAnswer { Text = possibleAnswer });
                }
            }
            return question;
        }
    }

这是我创建新问题的发布方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddQuestion(QuestionVM questionVM)
{
    try
    {
        if (ModelState.IsValid)
        {
            Question question = questionVM.ToQuestion();
            context.Questions.Add(question);
            context.SaveChanges();
            return RedirectToAction("Questions");
         }
     }
     catch (DataException /* dex */)
     {
        //Log the error (uncomment dex variable name and add a line here to write a log.
        ModelState.AddModelError("", "Trenutno nije moguće snimiti promjene, pokušajte ponovo.");
     }
     return View(questionVM);
}

线路:question.PossibleAnswers.Add(new PossibleAnswer { Text = possibleAnswer }); 导致异常,因为在将它们添加到问题之前我没有将可能的答案保存在数据库中......但是如何在不使用 DbContext 的情况下将它们添加到数据库中(因为在转换的方法中使用 DbContext 不是一个好习惯查看模型到模型)?

【问题讨论】:

  • 贴出一些导致异常的行,同时指出这行导致了异常。
  • 好的,我编辑了问题。
  • 一切似乎都很好。 QuestionVMToQuestion方法的实现是什么?
  • 我也提出了疑问。
  • 在下面查看我的答案。

标签: asp.net-mvc entity-framework


【解决方案1】:

由于可能的答案没有被标记为添加的实体,因此出现错误。

所以更新你的 QuestionVM 如下:

public class QuestionVM
{
    public QuestionVM() {
    }
    public QuestionVM(Question question) : this()
    {
        ID = question.ID;
        Text = question.Text;
        IsAssociatedWithProfessor = question.IsAssociatedWithProfessor;
        IsAssociatedWithAssistant = question.IsAssociatedWithAssistant;
    }
    public int? ID { get; set; }
    public string Text { get; set; }
    public bool IsAssociatedWithProfessor { get; set; }
    public bool IsAssociatedWithAssistant { get; set; }
    private IEnumerable<string> _possibleAnswers;
    public IEnumerable<string> PossibleAnswers 
    { 
        get
        {
            return _possibleAnswers ?? new List<string>(){"", "", "", "", ""};
        }
        set 
        {
            _possibleAnswers = value;
        }
    }
    public Question ToQuestion()
    {
        Question question = new Question
        {
            Text = this.Text,
            IsAssociatedWithProfessor = this.IsAssociatedWithProfessor,
            IsAssociatedWithAssistant = this.IsAssociatedWithAssistant,
            PossibleAnswers = new List<PossibleAnswer>()
        };
        //ID will be null if creating new question
        if(ID != null)
        {
            question.ID = (int) ID;
        }
        return question;
    }

    public List<PossibleAnswer> GetPosibleAnswers()
    {
        var listOfPossibleAnswers = new List<PossibleAnswer>();
        foreach (string possibleAnswer in this.PossibleAnswers)
        {
            if (!String.IsNullOrEmpty(possibleAnswer))
            {
                listOfPossibleAnswers.Add(new PossibleAnswer { Text = possibleAnswer });
            }
        }
        return listOfPossibleAnswers;
    }
}

然后像下面这样更新您的代码。

    if (ModelState.IsValid)
    {
        Question question = questionVM.ToQuestion();
        context.Questions.Add(question);
        context.SaveChanges();
        question.PossibleAnswers.AddRange(questionVM.GetPosibleAnswers());
        context.SaveChanges();
        return RedirectToAction("Questions");
     }

【讨论】:

  • @bambiinela 错误即将到来,因为可能的答案没有被标记为添加的实体。请删除该行question.PossibleAnswers.Add(new PossibleAnswer { Text = possibleAnswer, Question=question });,然后尝试保存。
  • 你是对的,那条线会导致问题。但是我还能如何向我的数据库和问题添加可能的答案(但不使用我的 DbContext,因为在将视图模型转换为模型的方法中使用 DbContext 不是一个好习惯,反之亦然)?
  • @bambiinela 首先保存问题而不使用 PossibleAnswer,然后通过将 possibleAnswers 添加到问题集合来更新问题。
  • @bambiinela 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多