2013-07-11 8 views
5

私は今朝これを悩ませていますが、私は答えを見つけることができません。私はEFを使用してストアドプロシージャを参照しようとしていますが、何を試してもモデルブラウザに表示されません。Entity Frameworkはストアドプロシージャを表示しません

私はモーダルに手続きを取得しようとするには、次の手順を使用している:エンティティモデルに

  1. 追加手順を

  2. 右モデルをクリックして、新しいの追加]を選択します - > [関数インポート

  3. は(新しい複合コレクションを生成

  4. をそれに名前を付け、私の手順を選択します私はまた、どちらの作品)私はこの何回も行っている

OK

  • クリックエンティティを使用してみましたが、私はモデルの「機能の輸入」フォルダ内の関数を参照してくださいすることができますが、それはモデルには現れないので、私はそれを参照することはできません。

    私は、次の操作を行って、(インポートせずに)直接、ストアドプロシージャを参照できます:

    DBEntities db = new DBEntities(); 
        var test = db.gsp_GetGroups(); 
    

    しかし、私は大きな問題を回避することなく、IQueryable<T>にこれを変換することはできません。

    これを正しく追加するには、どの手順を忘れていますか?

    ありがとう

    P.S. VS 2012、asp.net 4.0

  • +0

    私は同じ問題を抱えていますが、問題が何であるか把握しましたか? – Michiel

    +0

    私のプロジェクトでは、ストアドプロシージャにEFを使用しなかったのですが、他の開発者との議論を覚えていますが、覚えているように、procには関連するモデルがないという問題がありました。私は彼に挑戦し、彼に尋ねます。 – Limey

    +0

    FWIW、ストアドプロシージャの結果をサーバー側のIQueryableでさらに拡張することはできません。追加のクエリ機能をデータセットに渡すには、テーブル値関数のインポートを使用する必要があります。 –

    答えて

    1

    @Limeyおそらく、インポート機能のレベルがAccessであることが原因です。試してみてください:

    Model Browserには、Function Inportsというフォルダがあります。今すぐ右クリックしてPropertiesを選択します。プロパティウィンドウで、最初のオプションはAccessで、Publicに変更し、model.edmxを保存します。

    コードに戻り、このコードが動作するかどうかを確認します。

    +0

    申し訳ありませんが、それはそうではありません。アクセスは既に公開に設定されています。 – Limey

    7

    EFモデルを生成するために使用しているSQLログインで、インポートしようとしているストアドプロシージャを実行する権限があることを確認します。

    1. App.configに移動して、connectionStringsエントリ(通常は下部にあります)を探します。複数の接続文字列がある場合は、コンテキストが使用する接続文字列が必要です。
    2. edmxファイルに移動し、ドリルダウンしてエンティティクラスを見つけます。
    3. たとえば、MyDbModel.edmxがある場合、MyDbModel.Context.ttにはMyDbModel.Context.csが含まれます。あなたはDbContextから継承するクラスを持つことになりますし、コンストラクタはbase("name=<your connection string name>")
    4. <your connection string name>を呼び出しますMyDbModel.Context.csファイルで
    5. はあなたのapp.configで探しているものです。
    6. あなたの接続文字列にはユーザーが表示されます(統合セキュリティとは、ログインしているADユーザーを意味します)。これは、プログラムを使用するすべてのユーザーに正しいDBアクセス権が与えられている場合にのみ有効です。 SQL Management Studioでの本番環境)
    7. ゴーユーザーの「セキュリティ保護可能なリソース」
    +0

    これは私の問題を解決しました。 – pixelmeow

    +0

    Markの答えにコメントしたので、助けがあれば、すべての人に実行権限を与えないでください。特定のログインに限定してDBを安全にしてください。この場合、あなたがEFモデルに割り当てたものです。 – David

    +0

    これはうまくいった!ありがとう –

    1

    に、このストアドプロシージャを追加するEntity Frameworkのはへのアクセス権を持たないユーザーIDでデータベースにサインオンされたためと考えられますストアドプロシージャを実行します。

    調べるには:あなたのapp.configファイルまたはweb.configファイルで

    をあなたの.NETプロジェクトで、user idは、データベースにアクセスしているかを確認します。 の直後にconnectionStringの後に表示されます。

    ストアドプロシージャの作成に使用したユーザーID(SQL)と異なる場合は、データベース管理者に、.NET(したがってEntity Framework)からのそのユーザーIDが、ストアドプロシージャを実行します。

    +0

    IDにはDBへのフルアクセス権があります。 – Limey

    1

    私はEntity Framework 5から6にアップグレードして問題を解決しました。

    テーブルセクションに同じスキーマが正しく表示されていましたが、私のカスタムSQLサーバースキーマはストアドプロシージャの下に表示されませんでした。

    これは他の人に役立つことを願っています。

    6

    Sql Server Management StudioでSPに移動し、プロパティを右クリックして、アクセス許可に移動してパブリックを実行に設定します。

    上記のすべてが許可の問題であると答えている可能性があります。上記の答えは私に理由を見せてこれを結論づけました。

    +1

    これに注意してください。publicに実行するとセキュリティの脆弱性が存在する可能性があります。アクセスが必要なSPに特定のログイン許可を与えて、そのままにしておくだけの方がいいでしょう。 – David

    +1

    良い呼び出し+1。これはパーミッションの問題を指しています。 –

    +1

    適切なユーザー/グループとストアドプロシージャにEXECUTEを許可していることを確認してください。私の場合、EXECUTEパーミッションを別のspからコピーしていて、それを変更しませんでした – kolin

    関連する問題