2012-02-15 1 views
1

多分私は何か明白でないか、または不吉なことが起こっているかもしれませんが、これは私には奇妙に思えます。 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ステートメントをデータベースに送信しません。

答えて

0

は、問題を発見しました。基礎となるテーブルに主キーがなかったのでSystem.Data.Linq.Table<>オブジェクトが.IsReadOnly = trueに設定されているようです。 Linqは、データベースから一意の識別子が提供されていない場合、エンティティの一意性をトラッキングする信頼性の高い方法を実際には持っていないため、理にかなっています。

エンティティの生成コードが設定子なしで影響を受ける型のプロパティを作成したり、設定時に例外をスローすることが期待されます。しかし、そうでない理由が他にもあるかもしれません。それは私が気づいていないものです。

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とSQLでそれまでに遭遇したことがないことは間違いです。しかし、私が持っている根本的な問題はそれより深いと思われます。 'myObj'の値を正しく更新していて、更新をデータベースに送り返していない新しいコードを反映するように質問を更新しました。 – David

+0

(本質的には、コードの私の「簡素化」が、あなたが記述したバグを紹介したと思われます)。 – David

+0

面白いことに、私が持っていた問題を発見した後、暫定的な 'myObj'を使わないようにコードを戻してください。このように割り当てができるように見えます。 – David

関連する問題