C# 更新集合时奇怪的DB上下文行为(在调试器中单步执行代码时有效)

C# 更新集合时奇怪的DB上下文行为(在调试器中单步执行代码时有效),c#,asp.net-mvc,entity-framework,dbcontext,C#,Asp.net Mvc,Entity Framework,Dbcontext,我有一个非常奇怪的行为,如果我使用调试器单步执行代码或只是运行应用程序(按play),实际上会得到不同的结果 模型是这样的 public class QuestionPack { public int QuestionPackID { get; set; } public string Hashcode { get; set; } public virtual ICollection<Question> Questions { get; set; }

我有一个非常奇怪的行为,如果我使用调试器单步执行代码或只是运行应用程序(按play),实际上会得到不同的结果

模型是这样的

public class QuestionPack
{ 
    public int QuestionPackID { get; set; }
    public string Hashcode { get; set; }
    public virtual ICollection<Question> Questions { get; set; }    
}
public class EFQuestionPackRepository : IQuestionPackRepository
{

    private EFDbContext context = new EFDbContext();

    public IQueryable<QuestionPack> QuestionsPacks
    {
        get { return context.QuestionPacks; }
    }


    public void SaveQuestionPack(QuestionPack questionpack)
    {
        if (questionpack.QuestionPackID == 0)
        {
            context.QuestionPacks.Add(questionpack);
        }

        else
        {
            QuestionPack dbEntry = context.QuestionPacks.Find(questionpack.QuestionPackID);
            if (dbEntry != null)
            {
                dbEntry.Hashcode = questionpack.Hashcode;
                dbEntry.Questions = questionpack.Questions; 
            }
        }
        context.SaveChanges();
    }
}
公共类问题包
{ 
public int QuestionPackID{get;set;}
公共字符串哈希代码{get;set;}
公共虚拟ICollection问题{get;set;}
}
我使用这样的存储库模式将这个类保存到数据库中

public class QuestionPack
{ 
    public int QuestionPackID { get; set; }
    public string Hashcode { get; set; }
    public virtual ICollection<Question> Questions { get; set; }    
}
public class EFQuestionPackRepository : IQuestionPackRepository
{

    private EFDbContext context = new EFDbContext();

    public IQueryable<QuestionPack> QuestionsPacks
    {
        get { return context.QuestionPacks; }
    }


    public void SaveQuestionPack(QuestionPack questionpack)
    {
        if (questionpack.QuestionPackID == 0)
        {
            context.QuestionPacks.Add(questionpack);
        }

        else
        {
            QuestionPack dbEntry = context.QuestionPacks.Find(questionpack.QuestionPackID);
            if (dbEntry != null)
            {
                dbEntry.Hashcode = questionpack.Hashcode;
                dbEntry.Questions = questionpack.Questions; 
            }
        }
        context.SaveChanges();
    }
}
公共类EFQuestionPackPository:iQuestionPackPository
{
私有EFDbContext上下文=新EFDbContext();
公众可查询的问题
{
获取{return context.QuestionPacks;}
}
公共作废保存问题包(问题包问题包)
{
如果(questionpack.QuestionPackID==0)
{
context.QuestionPacks.Add(questionpack);
}
其他的
{
QuestionPack dbEntry=context.QuestionPacks.Find(QuestionPack.QuestionPackID);
if(dbEntry!=null)
{
dbEntry.Hashcode=questionpack.Hashcode;
dbEntry.Questions=questionpack.Questions;
}
}
SaveChanges();
}
}

这在添加数据时非常有效,但当我尝试更新(else语句)时,我会在问题上得到双倍的结果,例如,问题会被保存,但已经保存的问题会被保存。因此,如果我有4个问题,则用一个问题更新该问题并保存,我最终会有9个问题

但是;如果我使用调试器单步执行代码(从SaveQuestionPack函数开始,在context.saveChanges()之后单击“continue”,我会得到预期的结果。我太困惑了,甚至不知道从哪里开始查找。 我想这与我试图存储一个集合这一事实有关,但为什么在我逐步完成保存过程时它会起作用呢


感谢您的任何意见。

我想我已经解决了这个问题,但我不确定为什么它会起作用

我加了这个,

dbEntry.Questions.Clear();
以前

dbEntry.Questions = questionpack.Questions;

有人知道为什么会这样纠正错误吗?

您是否重复使用同一个实例?数据上下文被设计为创建、使用、然后丢弃或处置。我不确定重复使用一个实例是否会产生您所看到的问题,但这是可能的。是的,我一直在使用同一个存储库。结果非常明确e、 当逐步通过代码时,它可以工作,但不起作用。”这在添加数据时非常有效,但当我尝试更新(else语句)时,我的问题会加倍,例如,问题会被保存,但已经保存的问题会被保存,因此如果我有4个问题,添加一个问题并保存,我最终会有9个问题。"--您首先谈到了更新问题,但后来您在添加数据时展示了一个关于该问题的示例。这里真正的问题是什么?添加数据还是更新数据?@Tim:那么,首先,我们停止重用上下文。在
SaveQuestionPack
中创建一个新上下文,或者为每个请求或som创建一个新的存储库类似。Sza,啊,很抱歉。这是在我更新数据时完成的,但这是通过“SaveQuestionPack”-函数完成的。我会尽量把它写得更好。谢谢注意。