2009-06-23 1 views
21

エンティティのフレームワークは非常に遅いので、ストアドプロシージャを使用しようとしましたが、この問題が発生しました。エンティティ・フレームワークのストアド・プロシージャを使用して、エンティティにそのナビゲーション・プロパティを移入させる方法を教えてください。

エンティティフレームワークでは、エンティティを生成するストアドプロシージャを定義できます。しかし、私のエンティティは、このメソッドを使用しているときに移入されていない 'ナビゲーションプロパティ'を持っています。

回避策はありますか?

+1

EFで何が起こっているのか分かりにくいかもしれません。私は、EFが非効率的になるようなことをしない限り、ほとんどの場合、EFが著しく遅くなることはありませんでした。 –

答えて

19

よく格納されたプロシージャは構成可能ではありません。したがって、あなたのSPROCを呼び出して、Include()や何かを使って、EFが自動的に同じクエリで関係を設定するような方法はありません。

ですから、製品およびカテゴリ

を持っていて、製品を取得するSPROCを持っていると言う:

得られた生成物は、そのカテゴリが読み込まれていませんつまり

​​

。あなたが言った製品のためのカテゴリを取得し第二のストアドプロシージャを使用している場合

は、しかし:

、すなわち

var categories = context.GetCategoriesForProducts(someproductfilter); 

は関連企業を結ぶ関係フィックスアップと呼ばれるEFでの機能は、第二のエンティティが入ると両方の呼び出しが行われた後、製品内の各製品が非ヌルカテゴリを持つことを保証します。

これは理想的ではありません。複数のクエリを実行しているためですが、うまくいきます。

代わりに、EFExtensionsを使用します。それを書いた人は、より多くのデータを一度に読み込むsprocsを書く能力を作り出しました。

ホープこれは私がEFとストアドプロシージャ(SPS)を研究し、このSO質問を見つけ

乾杯に アレックス

+0

この回答は最新のものですか? - 私はOPとまったく同じものを探しています。 –

+0

@KristianNissenあなたはもっと良い方法があるかどうかを知りましたか? EF6が解決策を持っているとうまくいけば5年経ちました。 – Todilo

4

に役立ちます。また、@ KristianNissenや@Todiloのような人たちがEF6のアップデートがあるかどうか尋ねました。

答えははいです.EF 6は変更されましたが、SPを使用しているときにナビゲーションプロパティを読み込むために何も追加しませんでした。また、SO questionのように、.Include()メソッドをSPで使用することはできません。

唯一の方法は、ナビゲーションプロパティを具体的にロードするようにSPを書き込むことです。しかし、SPの使用に関するMicrosoftの優れたドキュメントがいくつかあります。Query SPSP returning multiple result setsを参照してください。

完全性のために、EFバージョン6がもたらした変更は、ストアドプロシージャ(SP)が挿入、更新、および削除を処理できるようにすることでした。Microsoft articleおよびEntity Framework Tutotialを参照してください。

+0

コメントありがとう – user48545

関連する問題