2012-02-15 70 views
1

也許我錯過了一些顯而易見的東西,或者是一些邪惡的事情發生了,但是這對我來說似乎很奇怪。我有一個Linq到SQL數據上下文,我試圖更新記錄上的字段。更新不起作用,並且SQL Profiler跟蹤顯示沒有更新命令正在發佈到數據庫。所以我縮小了確切的代碼行,並刪除了各種變量以儘量簡化。什麼會導致Linq to SQL對象忽略新值?

隨着where條款不變,現在正在發生的事情在調試程序如下:

var foo = db.f_pp_Budgets 
      .Where(b => b.SeasonKey == seasonID) 
      .Where(b => b.Business == businessUnit) 
      .Where(b => b.Level == "R") 
      .Where(b => b.CodeKey == region.Key) 
      .Single().Trade; 
// foo is now set to 1 
db.f_pp_Budgets 
      .Where(b => b.SeasonKey == seasonID) 
      .Where(b => b.Business == businessUnit) 
      .Where(b => b.Level == "R") 
      .Where(b => b.CodeKey == region.Key) 
      .Single().Trade = region.Budget.Trade; 
// region.Budget.Trade was (and still is) 2 
// so the underlying Linq to SQL object should have a 2 in it, right? 
var baz = db.f_pp_Budgets 
      .Where(b => b.SeasonKey == seasonID) 
      .Where(b => b.Business == businessUnit) 
      .Where(b => b.Level == "R") 
      .Where(b => b.CodeKey == region.Key) 
      .Single().Trade; 
// baz is set to 1. Shouldn't it be 2? 

由於價值是不變的,叫db.SubmitChanges()自然不發送任何內容的數據庫。

有人可以想到價值不會改變的原因嗎?


更新代碼:(響應於 @Hogan's answer

var myObj = db.f_pp_Budgets 
       .Where(b => b.SeasonKey == seasonID) 
       .Where(b => b.Business == businessUnit) 
       .Where(b => b.Level == "R") 
       .Where(b => b.CodeKey == region.Key) 
       .Single(); 

var foo = myObj.Trade; 
// foo is now set to 1 

myObj.Trade = region.Budget.Trade; 
// region.Budget.Trade was (and still is) 2 

var baz = myObj.Trade; 
// baz is now set to 2 

該對象的值被更新。但是,db.SubmitChanges()仍不會將任何update語句發送到數據庫。

回答

0

發現問題。它看起來像System.Data.Linq.Table<>對象被設置爲.IsReadOnly = true,因爲基礎表沒有主鍵。有意義,因爲如果沒有從數據庫提供唯一標識符,Linq就沒有真正可靠的方法來跟蹤實體的唯一性。

人們會希望生成的實體代碼可以在沒有setter的情況下在受影響的類型上創建屬性,或者在設置時拋出異常。但可能還有其他很好的理由,爲什麼不是這樣,我不知道。

1

這個問題與方程式左值有關。那就是你不能評估一個表達式,然後在c變體中分配它。

答案很簡單,這樣做:

var myobj = db.f_pp_Budgets 
     .Where(b => b.SeasonKey == seasonID) 
     .Where(b => b.Business == businessUnit) 
     .Where(b => b.Level == "R") 
     .Where(b => b.CodeKey == region.Key) 
     .Single(); 

myobj.Trade = region.Budget.Trade; 

NB理解爲什麼你的代碼沒有工作,考慮以下兩個非法作業:

5+7 = 4 
obj.val + obj2.val = 4 
+0

很好的解釋,而且我從來沒有用Linq to SQL來解決這個問題,這很奇怪。但是,看來我所面臨的根本問題比這更深。我已經更新了這個問題,以反映新代碼,該代碼正確更新'myObj'上的值,但不會將任何更新發送回數據庫。 – David 2012-02-15 15:16:42

+0

(從本質上講,我的代碼的「簡化」引入了你所描述的錯誤,它巧妙地展示了與底層錯誤相同的觀察結果。) – David 2012-02-15 15:23:17

+0

有趣的是,在發現我遇到的問題後,我設置了代碼返回到不使用臨時'myObj',它工作正常。看起來可以用這種方式完成一項任務。 – David 2012-02-15 15:32:28

相關問題