Linq to SQL、Ajaxポストバック、およびASP.NETのページ状態
-
03-07-2019 - |
質問
これはよくある質問である必要がありますが、まだSOではないので、そうです。私は、インメモリモデルへのさまざまなデータ変更を許可するアプリケーションにLinq to SQLを使用しており、変更は非同期処理のためにキューに配置されます。だから、私は(まだ)アップデートを心配していません。 Webページのモーダルポップアップを使用して、データのさまざまな部分を変更できます。グリッドベースのものもあれば、単なる属性のものもあります。 ポストバックサイクルに耐えられない変更の問題に直面しています。明らかに、すべての変更が行われ、ユーザーがページを送信するまで、データベースに何も保持したくありません。
これまでに選択したルートは次のとおりです。
- 遅延読み込みを無効にしました
- ルートオブジェクトの[シリアライズ可能な]部分クラスを作成します
- そのセッションにセッションを入れて、onloadイベントで取得します
これは原則的に機能するようです。ただし、セッションからオブジェクトを取得した後、子のプロパティの一部を更新しようとすると
p.PhysicianSpecialties[0].physician_specialty_code =
ddlSpecialty.SelectedItem.Value;
このエラーが表示されます:
Operation is not valid due to the current state of the object.
エラーは、生成されたLinqセッターメソッドでの次のメソッド呼び出しが原因です。
this.SendPropertyChanging();
他のプロパティは問題なく更新されます:
p.PhysicianNames[0].first_name = txtFirstName.Text.ToUpper();
これによりエラーは発生しません。
質問:基本的に間違った方向に進んでいますか?これを行うより良い方法はありますか?エラーの原因は何ですか?
更新: 例外は「System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException」です。 にいると思うが、解決策がまだわかりません。
解決
MSDNから解決策を得ました。問題は次のとおりです。このスレッドではできません。一方的にアソシエーションを一方的に変更することはできませんが、IDを変更するだけでなく、新しい子オブジェクトを割り当てることで両端で変更する必要があります:
p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup = db.PhysicianSpecialtyLookups.Single(c => (c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));
他のヒント
そして、データバインディングを使用している場合、どのようにそれを行うのでしょうか?データグリッドビューにドロップダウンリストがあり、ドロップダウン値を変更するとこのエラーがスローされ始めました。これにより、関連付けを削除するか、データバインディングを使用しないでください。