次のコードを検討してください。
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
ます。