1

次のコードを検討してください。

var svc = new ProductDesignerEntities(AppSettings.ProductDesignerServiceLocation);

var scenariox = svc.Scenarios
    .Where(o => o.ID == id)
    .FirstOrDefault();

var scenario = svc.Scenarios
    .Expand(o => o.SomeNavigationProperty)
    .Where(o => o.ID == id)
    .FirstOrDefault();

このコードが実行scenario.SomeNavigationPropertyされると、データが取り込まれなくなります。入力するコードをコメントアウトscenarioxすると修正されます。どうしてこれなの?サービス コンテキストまたはデータ サービスを構成することでこれを修正することは可能ですか。それとも、何らかの方法でコードの設計を変更する必要がありますか?

私が考えることができる代替案はすべて、ある程度劣っています。

  • ProductDesignerEntitiesアクションごとにインスタンスを作成します。これにより、リクエスト内キャッシュがほぼ完全に無効になります。
  • ProductDesignerEntitiesコントローラーごとにインスタンスを作成します。ベース コントローラー クラスの場合はそれほど面倒ではありませんが、これによりコントローラー間のキャッシュが無効になり、同じコントローラー内の異なるアクションが同じテーブルの異なるナビゲーション プロパティのセットを必要とする場合、問題は解決されません。
  • プロパティが空の場合は、手動で入力します。このような手動のソリューションを一貫して実装することは困難です。バグの元になります。
  • プロパティは常に手動で入力してください。ナビゲーション プロパティの目的を無効にします。
  • リクエスト内のテーブルのすべての使用に同じ .Expand() リストがあることを確認してください。非常に迷惑で、修正が難しいバグを求めています。

私は最初の選択肢に傾き始めています。インスタンスごとに新しい接続のオーバーヘッドが追加されるにもかかわらず、問題が最も少ないようです:/

編集:サービスクエリを Fiddler で実行することができましたが、正しく見えます。しかし、コードscenarioをコメントアウトしない限り、ナビゲーション プロパティは空のままになりscenarioxます。

4

1 に答える 1

0

さらなる調査を行った後、ProductDesignerEntitiesとにかく各使用コンテキスト内で新しいインスタンスを作成することになっているように見えるので、それが私が使用するソリューションです。ただし、問題を適切に修正できなかったことが非常に気になります。

Fiddler によると、追加データの要求を実際に実行するため、非常に奇妙な構成の問題、または WCF データ サービスのバグのいずれかとして書き留めておきます。返されたオブジェクトに表示されないだけです。

于 2012-09-25T18:48:36.510 に答える