次の方法で共有


ストアド プロシージャを使用してクエリを実行する方法 (Entity Framework)

多くのアプリケーション開発者とデータベース管理者は、ストアド プロシージャを使用して、セキュリティを設定し、予測可能性を定義し、データベース内のデータのロジックをカプセル化します。ストアド プロシージャにマップされるデータを取得するアプリケーション コードでは、FunctionImport 要素で識別される関数を使用します。Entity Data Model (EDM) の実装にストアド プロシージャをマップするのに必要なスキーマ構文の基本要素については、「ストアド プロシージャを使用してモデルを定義する方法 (Entity Framework)」で説明されています。

EDM では、2 種類のストアド プロシージャのマッピングがサポートされています。データを更新するストアド プロシージャのマッピングの詳細については、「ストアド プロシージャのサポート (Entity Framework)」を参照してください。

このトピックの例には、AdventureWorks Sales Model が使用されています。この例のコードを実行するには、あらかじめプロジェクトに AdventureWorks Sales Model を追加し、Entity Framework が使用されるようにプロジェクトを構成しておく必要があります。具体的な方法については、「Entity Framework プロジェクトを手動で構成する方法」と「Entity Data Model を手動で定義する方法 (Entity Framework)」の手順を参照してください。

スキーマでは、次の 5 つのエンティティが定義されます。

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

以下の手順では、データ モデルの概念スキーマの GetOrderDetailsFunctionImport にマップされるストアド プロシージャを実行するクライアント アプリケーションおよびコードを実装します。この関数は、指定された SalesOrderHeader に関連付けられている SalesOrderDetail エンティティを取得します (このモデルの FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID アソシエーションを使用しても、この例と同じ内容を実行できます)。

データベースにストアド プロシージャを作成するには

  1. コンソール アプリケーションを作成します。

  2. トピック「ストアド プロシージャを使用してモデルを定義する方法 (Entity Framework)」で実装された DLL への参照を追加します。

  3. System.Data.Entity および System.Runtime.Serialization の参照を追加します。

  4. ストアド プロシージャを使用してモデルを定義する方法 (Entity Framework)」で実装した AdventureWorksModel のプリプロセッサ ディレクティブを追加します。

このストアド プロシージャは、SalesOrderHeaderId の必須パラメータと共に使用できます。オブジェクト ブラウザの構文は、AdventureWorksEntities 名前空間のメソッドである GetOrderDetails(int) として検索します。次のコードによって、ストアド プロシージャが実行され、foreach ループ内で列挙される結果が返されます。

Option Explicit On
Option Strict On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports AdvWrksSalesModel

Module Module1
    Sub Main()
        Try
            Using db As AdvWksSalesEntities = New AdvWksSalesEntities()
                Dim soHeaderNumber As Integer = 43659
                For Each order As SalesOrderDetail _
                            In db.GetOrderDetails(soHeaderNumber)
                    Console.WriteLine("Header#: {0} " & _
                        "Order#: {1} ProductID: {2} Quantity: {3} Price: {4}", _
                        soHeaderNumber, order.SalesOrderDetailID, order.ProductID, _
                        order.OrderQty, order.UnitPrice)
                Next

            End Using

        Catch ex As System.Data.MappingException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.CommandExecutionException
            Console.WriteLine(ex.ToString())
        End Try
    End Sub
End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdvWrksSalesModel;

namespace AdvWksSalesSProcs
{
    class Program
    {
        static void Main(string[] args)
        {
            using (AdvWksSalesEntities objCtx = 
                                new AdvWksSalesEntities())
            {
                try
                {
                    int soHeaderNumber = 43659;
                    foreach (SalesOrderDetail order in
                              objCtx.GetOrderDetails(soHeaderNumber))
                        Console.WriteLine("Header#: {0} " +
                        "Order#: {1} ProductID: {2} Quantity: {3} Price: {4}",
                        soHeaderNumber, order.SalesOrderDetailID,
                        order.ProductID,
                        order.OrderQty, order.UnitPrice);

                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }

            }
        }
    }
}

出力結果は次のようになります。

Header#: 43659 Order#: 1 ProductID: 776 Quantity: 1 Price: 2024.9940
Header#: 43659 Order#: 2 ProductID: 777 Quantity: 3 Price: 2024.9940
Header#: 43659 Order#: 3 ProductID: 778 Quantity: 1 Price: 2024.9940
Header#: 43659 Order#: 4 ProductID: 771 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 5 ProductID: 772 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 6 ProductID: 773 Quantity: 2 Price: 2039.9940
Header#: 43659 Order#: 7 ProductID: 774 Quantity: 1 Price: 2039.9940
Header#: 43659 Order#: 8 ProductID: 714 Quantity: 3 Price: 28.8404
Header#: 43659 Order#: 9 ProductID: 716 Quantity: 1 Price: 28.8404
Header#: 43659 Order#: 10 ProductID: 709 Quantity: 6 Price: 5.7000
Header#: 43659 Order#: 11 ProductID: 712 Quantity: 2 Price: 5.1865
Header#: 43659 Order#: 12 ProductID: 711 Quantity: 4 Price: 20.1865

参照

処理手順

ストアド プロシージャを使用してモデルを定義する方法 (Entity Framework)

概念

AdventureWorks Sales Model (EDM)
ストアド プロシージャのサポート (Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)