エンティティフレームワークのストアドプロシージャを使用して、エンティティのナビゲーションプロパティを設定する方法

.net c# entity entity-framework

質問

エンティティフレームワークの動作が非常に遅いため、ストアドプロシージャを使用してみましたが、この問題に遭遇しました。

Entity Frameworkでは、エンティティを生成するストアドプロシージャを定義できます。しかし、私のエンティティには、このメソッドを使用するときに入力されていない「ナビゲーションプロパティ」があります。

回避策はありますか?

受け入れられた回答

うまく保存された手順は構成できません。したがって、SPROCを呼び出して、Include()などを使用してEFに同じクエリ内の関係を自動的に設定させる方法はありません。

製品とカテゴリがあるとします。

そしてあなたはProductsを得るためにsprocを持っています:

すなわち

var products = context.GetProducts(someproductfilter);

結果として得られる製品には、そのカテゴリがロードされません。

ただし、前述の製品のカテゴリを取得する2つ目のストアドプロシージャがあるとします。

すなわち

var categories = context.GetCategoriesForProducts(someproductfilter);

2つ目のエンティティがコンテキストに入ると関連エンティティをリンクするEFの機能はリレーションシップの修正と呼ばれ、両方の呼び出しが行われた後、productsの各商品がnull以外のカテゴリを持つことを保証します。

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

代わりの方法はEFExtensionsを使うことです 。それを書いた人は、一度にもっと多くのデータをロードするsprocsを書くことができるようになりました。

お役に立てれば

乾杯アレックス


人気のある回答

私は、ストアドプロシージャ(SP)をEFで調査したときに、このような問題を見つけました。また、@ KristianNissenや@Todiloのような人たちが、EF6のアップデートがあるかどうか尋ねているのを見ます。

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

唯一の方法は、ナビゲーション特性を具体的にロードするようにSPを書くことです。しかし、 SPの使用に関するMicrosoftの優れたドキュメントがいくつかあります - Query SPSPが複数の結果セットを返すを参照してください。

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



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ