C# Context.SaveChanges()导致重复问题

C# Context.SaveChanges()导致重复问题,c#,mysql,entity-framework,C#,Mysql,Entity Framework,目前,我们正在本地主机上的WampServer上运行MySQL数据库。我们有几个类,并使用POCO类将它们映射到数据库表 我们有一个存储库,用于按标准处理所有创建、编辑和删除操作。 我们向该存储库传递一个问题对象,该问题对象具有基本属性,如id、文本,还包含一个导航属性,用于链接到该问题的所有答案 在poco问题类中,所有答案都存储为一个ICollection。这已经运行了好几个星期,能够更新、删除和创建,没有任何问题 现在突然,任何时候我们试图编辑一个问题,它会导致其答案的指数级重复,2变成4

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

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

在poco问题类中,所有答案都存储为一个ICollection。这已经运行了好几个星期,能够更新、删除和创建,没有任何问题

现在突然,任何时候我们试图编辑一个问题,它会导致其答案的指数级重复,2变成4,变成8,在我们知道之前,我们已经有了近60k个答案,因为我们试图解决这个问题

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

 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
public int Question_Id{get;set;}
公共字符串问题\文本{get;set;}
公共字符串问题\u帮助{get;set;}
公共字符串问题类型{get;set;}
[显示(Name=“Set ID”)]
公共整数集_Id{get;Set;}
公共集集{get;Set;}
私人ICollection\u答案;
公共i收集答案
{
得到
{
如果(_answers==null)
{
_answers=Arep.GetAnswers(这个问题的Id);
}
返回答案;
}
设置
{
_答案=价值;
}
}//属于此问题的答案集合
编辑2:我想我现在可能离真正的问题更近了一大步。感谢CodeCaster提供的有用链接,我在上一次查询中查看了它,当它有2个答案时,它只执行2个insert语句,这是意料之中的,但我最终总共得到了4个答案,显然这里真正的问题是,当答案与编辑过的问题一起传递时,它会添加新的答案,这以前从未发生过


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

不知道问题是什么,无法从您的问题中读出问题所在,因此不知道这是否解决了问题,但我会让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{get;set;}
公共字符串问题\文本{get;set;}
公共字符串问题\u帮助{get;set;}
公共字符串问题类型{get;set;}
[显示(Name=“Set ID”)]
公共整数集_Id{get;Set;}
公共集集{get;Set;}
公共虚拟ICollection答案{get;set;}
}

答案是否有ID字段?我想是的,当它们与EF一起使用时。

多亏了CodeCaster关于如何记录所有执行的查询的有用提示,我才能够看到添加了正确的数量

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


非常感谢CC

POCO看起来像什么?你用什么来做DAL?实体框架?,因为您发布的代码没有问题。您确定复制源于此吗?@SteenT Yes实体框架,请参阅对poco的编辑class@CodeCaster是的,我确定这就是复制发生的地方,从开始到结束,一步一步地调试整个程序,至少调试了10次,有很多断点和很多变量专门用来捕获我正在监视的属性。一切都很好,它进入savechanges很好,并且必须在那里复制,因为下一行我捕捉到了答案,它们是正确的duplicated@CodeCaster谢谢你!您解决了我的问题,记录执行的查询使我能够看到我所做的错误,上下文假设answers icollection中的实体与数据库中的实体不同,因此添加它们,从而导致重复。只需在添加编辑的问题之前清空该属性,我的问题就会消失!非常感谢