【问题标题】:Context.SaveChanges() causing duplication issuesContext.SaveChanges() 导致重复问题
【发布时间】:2012-07-24 10:28:52
【问题描述】:

目前我们正在本地主机上的 WampServer 上运行 MySQL 数据库。我们有几个类,并使用 POCO 类将它们映射到数据库表。

我们有一个存储库,用于按照标准处理所有创建、编辑和删除。 我们向这个存储库传递一个 Question 对象,这个 question 对象具有基本属性,例如 id、文本,还包含一个导航属性以链接到该问题的所有答案。

在 poco 类问题中,所有答案都存储为 ICollection。几周以来,这一直运行良好,能够毫无问题地更新、删除和创建。

现在突然之间,每当我们尝试编辑一个问题时,它都会导致其答案呈指数级重复,2 变成了 4,然后变成了 8,在我们知道它之前,我们在试图解决这个问题时得到了近 6 万个答案问题。

存储库中用于编辑问题的代码:

 public void EditQuestion(Question question)
    {
        var tempquestion = Context.Questions.Single(q => q.Question_Id == question.Question_Id);

        tempquestion.Question_Help = question.Question_Help;
        tempquestion.Question_Text = question.Question_Text;
        tempquestion.Question_Type = question.Question_Type;

        context.SaveChanges();}

我们已经在每一行都设置了断点,检查了 answer 属性,它在整个过程中保持正确的数字,然后它命中 context.saveChanges() 并且如果我们捕捉到结果突然它重复了。

进一步说明和要求的代码:

是的,我正在为此使用实体框架,我应该指定。

我的 poco 课程是这样的:

public int Question_Id { get; set; }

    public string Question_Text { get; set; }

    public string Question_Help { get; set; }

    public string Question_Type { get; set; }

    [Display(Name = "Set ID")]
    public int Set_Id { get; set; }

    public Set Set { get; set; }

    private ICollection<Answer> _answers;
    public ICollection<Answer> Answers
    {
        get
        {
            if (_answers == null)
            {
                _answers = Arep.GetAnswers(this.Question_Id);
            }
            return _answers;
        }
        set
        {
            _answers = value;
        }
    } //a collection of answers belonging to this question

编辑 2:我想我现在可能离真正的问题更近了一大步。感谢 CodeCaster 提供的有用链接,我检查了我的最后一个查询,当它有 2 个答案时,它只执行 2 个插入语句,这是预期的,但我最终得到 4 个答案,显然这里真正的问题是它添加了新的当答案与已编辑的问题一起传递时,这种情况从未发生过。

希望解决方法是发送已编辑的问题而不附带任何答案,这样就不会插入新的问题,也不会产生重复的问题。

【问题讨论】:

  • POCO 是什么样的?你用什么做 DAL?实体框架?
  • Log your queries,因为您发布的代码没有任何问题。你确定重复是从那里开始的吗?
  • @SteenT 是实体框架,请参阅 poco 类的编辑
  • @CodeCaster 是的,我确定这就是重复发生的地方,从头到尾逐步调试整个程序至少 10 次,许多断点和许多特定于捕捉我正在观看的属性的变量。一切正常,它进入 savechanges 很好,并且必须在那里复制,因为下一行我抓住了答案并且它们被复制了
  • @CodeCaster 谢谢!你解决了我的问题,记录执行的查询让我看到我正在做的错误,上下文假设答案集合中的实体与数据库中的实体不同,因此添加它们,从而导致重复。在添加编辑的问题之前简单地清空该属性,我的问题就消失了!非常感谢

标签: c# mysql entity-framework


【解决方案1】:

不知道问题是什么,无法从您的问题中读出,所以不知道这是否能解决问题,但我会让 POCO 像这样:

public class Question {
    public int Question_Id { get; set; }
    public string Question_Text { get; set; }
    public string Question_Help { get; set; }
    public string Question_Type { get; set; }
    [Display(Name = "Set ID")]
    public int Set_Id { get; set; }
    public Set Set { get; set; }
    public virtual ICollection<Answer> Answers { get; set; }
}

答案是否有 ID 字段?我猜他们会这样做,当它们与 EF 一起使用时。

【讨论】:

    【解决方案2】:

    感谢 CodeCaster 关于如何记录所有执行的查询的有用提示,我能够看到实际上添加了正确的数量。

    问题在于它根本不应该添加答案!但是因为每当我更新问题时问题属性都有答案,所以它重新添加了所有答案!因此导致我在保存更改的整个过程中看到正确的数字,但之后却看到错误的数字。

    非常感谢CC!

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2020-03-13
      相关资源
      最近更新 更多