2011-03-07 73 views
1

简而言之,一个表中的一个特定记录会更新,而同一个表中的多个附加修改则不会更新。不是DataContext.SubmitChanges()中的所有记录更新()(Linq to SQL)

theStat.SubmitChanges()

statToIncrease情况下也不更新时SubmitChanges()

在看.GetChangeSet(),正在只进行一次更新更新确定。为什么statToIncrease更新后没有更新?我必须为每个更新打开一个新的DataDataContext吗?

UserStathas a primary key

也许另一个问题

难道是明智致以UserStat类像.Add(double amountToAdd)的方法?另一个连接将不得不打开,但它可以让我继续使用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"); 

回答

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(); 
} 
+0

这很奇怪 - 也许我在实施之前没有足够的考虑它。基本上,'statst'需要减少多个'statToIncrease'操作过程中发现的累积值。我会尽力重新工作并让你知道,谢谢。 – 2011-03-10 16:26:20

0

尝试显式连接您修改实体使用:

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

待办事项我必须打开每个更新都有新的 DataDataContext?

不,你没有。

+0

没有明确附件的运气。 – 2011-03-07 21:25:44

+0

@大卫:只是一个假设 - “statToIncrease”和“theStat”指向同一个实体? – Alex 2011-03-07 22:16:38

+0

@Alex:否定的。我刚刚评论了下面的回复,因为这是比任何内容更多的示例代码。我的实际代码确实会在循环的每次迭代中返回不同的实体。 – 2011-03-08 13:16:58

0

这是你的问题:

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

这显然返回在每次迭代的同一对象。而且我猜测这个Stat的ID是1,这就是它更新的原因。

+0

我应该提到这是示例代码。我真正的代码在循环的每次迭代中都会将一个单独的实体返回给'statToIncrease'。它就像'.Where(s => s.ID == i)...' – 2011-03-08 13:16:00