并非所有记录都在DataContext.SubmitChanges()上更新(Linq to SQL)

时间:2011-03-07 20:34:58

标签: .net linq-to-sql datacontext

简而言之,一个表中的一个特定记录会更新,而同一个表中的多个附加修改则不会更新。

theStat.SubmitChanges()

后更新

statToIncrease个实例在SubmitChanges()

更新

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

UserStathas a primary key

也许是另一个问题

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

        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");

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

尝试使用以下方法显式附加修改后的实体:

db.UserStats.Attach(statToIncrease, true);
...
db.SubmitChanges();
  

我必须开一个新的   每个更新的DataDataContext?

不,你没有。

答案 2 :(得分:0)

这是你的问题:

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

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