【问题标题】:LInq update is also inserting unwanted rowsLInq 更新也在插入不需要的行
【发布时间】:2009-11-13 03:51:42
【问题描述】:

我是 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(); 行上放了一个断点。并且这些行肯定会在此时插入,而不是之前插入,之后也不会插入一些代码。

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

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

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

    【讨论】:

    • 这很有帮助。我现在对 DataContext 有了更好的理解。
    • 我们如何与第一个理由竞争?由于外键关系,我别无选择,我必须插入包含其他链接对象(entitiyref)的新对象
    【解决方案2】:

    致电DataContext.GetChanges(),看看还捕获了什么。它可能来自先前对数据上下文的“未提交”操作。

    【讨论】:

    • 确实如此。我有 20 个插页。毫无疑问,原因是因为我的 DataContext 字段存储如下;公共静态 FWHDataContext db = new FWHDataContext();我输入了以下代码;变更集 cs = db.GetChangeSet(); db.GetChangeSet().Inserts.Clear(); cs = db.GetChangeSet();最初设置断点,看看发生了什么。然而,清除插入物会产生意想不到的连锁反应。对此的最佳解决方案是什么?
    • 为什么 DataContext 是静态的?这似乎很危险。 DataContext 被设计为轻量级的,因此您可以在任何需要的地方创建它们。最好是多次创建和销毁它们,而不是让一个人随随便便。
    • 你说得对,它不应该是静态的。我现在已经改变了。
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多