LInq更新还插入了不需要的行

时间:2009-11-12 17:18:30

标签: c# linq-to-sql

我是Linq to SQL的新手,但我对我更新表的问题感到惊讶。 从阅读各种来源我认为我得到的问题是ORM映射的问题,但即便如此,鉴于我使用VS 2008并通过LINQ to SQL类创建我的dbml,我不指望这样。 所以发生的事情是,当我更新和/或插入一行时,也会在表中创建许多其他行。当发生这种情况时,我无法预测模式是什么,有时它不会发生。 我不确定下面的代码非常说明问题是什么,但我在这里重现它;

    public static void UpdateDailyTimeRecorded(
        int dailyTimeRecordedId, bool amFlag, string timeIn, string timeOut)
    {
        DailyTimeRecorded dtr = GetDailyTimeRecorded(dailyTimeRecordedId);
        if (amFlag == true)
        {
            dtr.MorningTimeIn_HH = Convert.ToInt32(timeIn.Substring(0, 2));
            dtr.MorningTimeIn_MM = Convert.ToInt32(timeIn.Substring(3, 2));
            dtr.MorningTimeOut_HH = Convert.ToInt32(timeOut.Substring(0, 2));
            dtr.MorningTimeOut_MM = Convert.ToInt32(timeOut.Substring(3, 2));
            dtr.MorningLeaveFlagId = 0;
        }
        else
        {
            dtr.AfternoonTimeIn_HH = Convert.ToInt32(timeIn.Substring(0, 2));
            dtr.AfternoonTimeIn_MM = Convert.ToInt32(timeIn.Substring(3, 2));
            dtr.AfternoonTimeOut_HH = Convert.ToInt32(timeOut.Substring(0, 2));
            dtr.AfternoonTimeOut_MM = Convert.ToInt32(timeOut.Substring(3, 2));
            dtr.AfternoonLeaveFlagId = 0;
        }
        try
        {
            db.SubmitChanges();
        }
        catch (ChangeConflictException)
        {
            db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);
        }
    }

我在db.SubmitChanges()行上放了一个断点;并且在这一点上插入行是肯定的,而不是之前,而不是之前的某些代码。

2 个答案:

答案 0 :(得分:2)

我知道可能导致LINQ插入意外数据的一个原因就是这个。即使您没有向特定表显式添加一行数据,如果您将其链接到已明确添加的另一个对象,LINQ to SQL将隐式添加它。

另一个原因是您无法轻松回滚或撤消添加到上下文的挂起更改。我的理解是,最好的做法是处理包含不需要的对象的上下文,并在您意识到不想执行更新时启动一个新对象。

答案 1 :(得分:1)

致电DataContext.GetChanges()并查看其他内容。它可能来自之前对数据上下文的“未提交”操作。