【问题标题】:Not all records update on DataContext.SubmitChanges() (Linq to SQL)并非所有记录都在 DataContext.SubmitChanges() 上更新(Linq to SQL)
【发布时间】:2011-03-10 20:23:00
【问题描述】:

简而言之,一张表中的一条特定记录会更新,而同一张表中的多项其他修改则不会。

theStat 在.SubmitChanges() 上更新OK

statToIncrease 实例不更新SubmitChanges()

在观看.GetChangeSet() 时,只进行了一次更新。为什么statToIncrease 的任何实例在修改后没有更新?我是否必须为每次更新打开一个新的DataDataContext?

UserStat 表 has a primary key。

可能是另一个问题

用.Add(double amountToAdd) 之类的方法扩展我的UserStat 类是否明智?必须打开另一个连接,但它可以让我继续使用 LINQ-only,对吗?

        using (DataDataContext db = new DataDataContext())
        {
            Random r = new Random();

            var theStat = db.UserStats.FirstOrDefault();

            // tried scoping `statToIncrease` outside of the for loop
            // didn't fix anything
            UserStat statToIncrease = null;

            for (int i = 0; i < vm.stats.Count(); i++)
            {
                statToIncrease = db.UserStats.Where(s => s.ID == i)
                    .FirstOrDefault();
                // here, .Property is type float
                statToIncrease.Property += r.NextDouble();
                // here, .Property is type int
                theStat.Property -= 1;
            }

            // create and insert another object
            // this object is inserted correctly

            // right here, .ChangeSet() only has one insert and one update
            // the update is only for `theStat` and not 
            // any modifications to `statToIncrease`
            db.SubmitChanges();
        }

更新

我发现这样做很丑:

db.ExecuteCommand("UPDATE [UserStat] SET [Value] = {0} WHERE [ID] = {1}, 
    statToIncrease.Value + amount, statToIncrease.ID");

【问题讨论】:

    标签: .net linq-to-sql datacontext


    【解决方案1】:

    我不确定到底是什么问题,但是您重复使用同一个变量 (statToIncrease) 并一次获取一条记录似乎很奇怪。获取对象列表,遍历列表并更新它们,然后调用SubmitChanges,似乎更合理:

    using (DataDataContext db = new DataDataContext())
    {
        var r = new Random();
    
        UserStat theStat = db.UserStats.FirstOrDefault();
    
        List<UserStat> statsToIncrease = 
                                   db.
                                   UserStats.
                                   Where(s => s.ID >= 0 && s.ID < vm.stats.Count()).
                                   ToList();
    
        foreach (UserStat statToIncrease in statsToIncrease)
        {
            statToIncrease.Property += r.NextDouble();
            theStat.Property -= 1;
        }
    
        db.SubmitChanges();
    }
    

    【讨论】:

    • 这很奇怪——也许我在实施之前没有考虑足够的问题。基本上,theStat 需要减少在多次statToIncrease 操作期间发现的一些累积值。我会尝试重新工作并让您知道,谢谢。
    【解决方案2】:

    尝试使用 :

    显式附加您修改过的实体
    db.UserStats.Attach(statToIncrease, true);
    ...
    db.SubmitChanges();
    

    我是否必须打开一个新的 每次更新的 DataDataContext?

    不,你没有。

    【讨论】:

    • 显式附件不走运。
    • @David:只是一个假设——statToIncrease 和 theStat 指向同一个实体?
    • @Alex:否定。我只是评论了下面的回复,因为这是比任何东西都多的示例代码。我的实际代码确实在循环的每次迭代中返回单独的实体。
    • @David:我试图重现您的问题(除了从我的.dbml 获取的实体)。不幸的是,我无法重现这一点。可能是您(假设)覆盖的SubmitChanges 方法中的magic?
    • @Alex:你是什么意思?我没有覆盖.SubmitChanges() 方法;你建议我应该这样做吗?
    【解决方案3】:

    这是你的问题:

    .Where(s => s.ID == 1).FirstOrDefault();
    

    这显然会在每次迭代中返回相同的对象。我猜 theStat 的 ID 为 1,这就是它更新的原因。

    【讨论】:

    • 我应该提到这是示例代码。我的真实代码确实会在循环的每次迭代中向statToIncrease 返回一个单独的实体。就像.Where(s =&gt; s.ID == i)...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多