web-dev-qa-db-ja.com

ASP.NET MVC:ストアドプロシージャを呼び出すための最良の方法

ストアドプロシージャを呼び出すための最良の方法を決定しようとしています。

私はASP.NETMVCを初めて使用し、Linq toSQLとEntityFramework、およびリポジトリパターンについて多くのことを読んでいます。正直なところ、L2SとEFの本当の違いを理解するのに苦労しています...しかし、アプリケーション内で構築しているものが正しいことを確認したいと思います。

今のところ、ストアドプロシージャを適切に呼び出して、a)ユーザー情報を保存して応答を取得し、b)製品のカタログの情報を取得する必要があります。

これまで、Linq to SQL .dbmlファイルを作成し、サーバーエクスプローラーからsotredプロシージャを選択して、そのインスタンスを.dbmlにドラッグしました。私は現在、次のようにストアドプロシージャを呼び出しています。

MyLinqModel _db = new MyLinqModel();
_db.MyStoredProcedure(args);

もっと関与する必要があることはわかっています...さらに、コントローラー内でこれを行っていますが、これは良い習慣ではないと理解しています。

誰かが私の問題がここにあることを認識できますか?

12
dcolumbus

ストアドプロシージャを呼び出すだけの場合、LINQとEFはおそらくやり過ぎです。

Enterprise Libraryを使用していますが、ADO.NETでも問題なく動作します。

このチュートリアル を参照してください。

簡単に(参照された記事から恥知らずにコピーして貼り付けた):

    SqlConnection conn = null;
    SqlDataReader rdr  = null;

    // typically obtained from user
    // input, but we take a short cut
    string custId = "FURIB";

    Console.WriteLine("\nCustomer Order History:\n");

        // create and open a connection object
        conn = new SqlConnection("Server=(local);DataBase=Northwind; Integrated Security=SSPI");
        conn.Open();

        // 1.  create a command object identifying
        //     the stored procedure
        SqlCommand cmd  = new SqlCommand(
            "CustOrderHist", conn);

        // 2. set the command object so it knows
        //    to execute a stored procedure
        cmd.CommandType = CommandType.StoredProcedure;

        // 3. add parameter to command, which
        //    will be passed to the stored procedure
        cmd.Parameters.Add(
            new SqlParameter("@CustomerID", custId));

        // execute the command
        rdr = cmd.ExecuteReader();

        // iterate through results, printing each to console
        while (rdr.Read())
        {
            Console.WriteLine(
                "Product: {0,-35} Total: {1,2}",
                rdr["ProductName"],
                rdr["Total"]);
        }
    }

更新

私はあなたがあなたのコントローラーでこれをしているとあなたが言った部分を逃しました。

いいえ、それはこれを行う正しい方法ではありません。

コントローラは、実際にはビュー構築の調整にのみ関与する必要があります。 「データアクセス層」などと呼ばれる別のクラスライブラリを作成し、ストアドプロシージャの呼び出し、結果からのオブジェクトの作成などを処理するクラスを作成します。これをどのように処理するかについては多くの意見がありますが、おそらく最も一般的なものは次のとおりです。

View
|
Controller
|
Business Logic
|
Data Access Layer
   |--- SQL (Stored procs)
           -Tables
           -Views
           -etc.
   |--- Alternate data sources
           -Web services
           -Text/XML files
           -blah blah blah.

MSDNには、このトピックに関する適切なチュートリアルがあります。

19
3Dave

これを試して:

読んだ:

var authors = context.Database.SqlQuery<Author>("usp_GetAuthorByName @AuthorName", 
new SqlParameter("@AuthorName", "author"));

更新:

var affectedRows = context.Database.ExecuteSqlCommand
("usp_CreateAuthor @AuthorName = {0}, @Email= {1}", 
"author", "email");

このリンクから: http://www.dotnetthoughts.net/how-to-execute-a-stored-procedure-with-entity-framework-code-first/

そして、コントローラーにルーチンを含める代わりに、DavidLivelyが言及したフレームワークを使用します。編集のために別のリポジトリクラスの関数から結果をIEnumerable<blah>として返すだけで、更新が更新に成功したかどうかをブール値で返します。

3
vapcguy

LINQ toSQLおよびADO.NETEFは、読み取りストアドプロシージャを、さまざまなエンティティに対抗するために使用するデータ/オブジェクトコンテキストクラスにアタッチします。作成、更新、および削除の場合、モデルが生成するエンティティのプロパティをマップするprocを作成できます。また、エンティティマッピングウィンドウ(今は正確な名前を忘れてください)を使用して、procパラメーターを使用してエンティティフィールドをマップできます。 。したがって、Customersテーブルがあるとすると、EFはCustomersエンティティを生成し、更新/挿入/削除を試みるときにprocパラメータをCustomerエンティティのプロパティにマップできます。

これで、CUD procを関数にマップできますが、すべての影響を把握しているわけではありません。私は今言った方法が一番好きです。

HTH。

2
Brian Mains