多分私は何か明白でないか、または不吉なことが起こっているかもしれませんが、これは私には奇妙に思えます。 Linq to SQLのデータコンテキストがあり、レコードのフィールドを更新しようとしています。更新プログラムは機能していませんでした。SQLプロファイラートレースは、更新コマンドがデータベースに発行されていないことを示しました。そこで、コードの正確な行を絞り込んで、さまざまな変数を削除して単純化しようとしました。値が変更されていないLinqからSQLオブジェクトに新しい値を無視させる原因は何ですか?
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()
を呼び出し、次のように今デバッガで何が起こっているか変わらないwhere
句、と
です。
値が変更されない理由を誰もが考えることができますか?
更新されたコード :(@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とSQLでそれまでに遭遇したことがないことは間違いです。しかし、私が持っている根本的な問題はそれより深いと思われます。 'myObj'の値を正しく更新していて、更新をデータベースに送り返していない新しいコードを反映するように質問を更新しました。 – David
(本質的には、コードの私の「簡素化」が、あなたが記述したバグを紹介したと思われます)。 – David
面白いことに、私が持っていた問題を発見した後、暫定的な 'myObj'を使わないようにコードを戻してください。このように割り当てができるように見えます。 – David