1

これはよくある質問ですが、まだ 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」です。私は何かに取り組んでいると思いますが、解決策はまだわかりません。

4

2 に答える 2

2

私はMSDNから解決策を得ました。問題は、このスレッドで私ができるよりもよく説明されていますが、一方的に関連付けを変更することはできませんが、IDを変更するだけでなく、新しい子オブジェクトを割り当てることによって、両端で行う必要があります。

p.PhysicianSpecialties [0] .PhysicianSpecialtyLookup = db.PhysicianSpecialtyLookups.Single(c =>(c.physician_specialty_code == ddlSpecialty.SelectedItem.Value));

于 2009-05-05T02:07:23.673 に答える
0

また、データバインディングを使用している場合、どのようにそれを行うのでしょうか? データ グリッド ビューにドロップダウン リストがあり、ドロップダウン値を変更するとこのエラーがスローされ始めました。これにより、関連付けを削除するか、データバインディングを使用しない必要があると思います。

于 2009-05-28T22:08:09.920 に答える