也許我錯過了一些顯而易見的東西,或者是一些邪惡的事情發生了,但是這對我來說似乎很奇怪。我有一個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
語句發送到數據庫。
很好的解釋,而且我從來沒有用Linq to SQL來解決這個問題,這很奇怪。但是,看來我所面臨的根本問題比這更深。我已經更新了這個問題,以反映新代碼,該代碼正確更新'myObj'上的值,但不會將任何更新發送回數據庫。 – David 2012-02-15 15:16:42
(從本質上講,我的代碼的「簡化」引入了你所描述的錯誤,它巧妙地展示了與底層錯誤相同的觀察結果。) – David 2012-02-15 15:23:17
有趣的是,在發現我遇到的問題後,我設置了代碼返回到不使用臨時'myObj',它工作正常。看起來可以用這種方式完成一項任務。 – David 2012-02-15 15:32:28