2011-03-07 74 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