HOW TO:使用預存程序執行查詢 (Entity Framework)
許多應用程式開發人員和資料庫管理員都會使用預存程序來強制實行安全性、提供可預測性,並將資料上的邏輯封裝在資料庫內。會擷取資料且對應至預存程序 (Stored Procedure) 的應用程式程式碼可使用由 FunctionImport 項目識別的函式。HOW TO:定義具有預存程序的模型 (Entity Framework) 主題說明將預存程序對應至 Entity Data Model (EDM) 實作 (Implementation) 所需之結構描述語法的基本項目。
EDM 支援兩種預存程序對應。如需更新資料之對應預存程序的詳細資訊,請參閱預存程序支援 (Entity Framework)。
本主題的範例是根據 Adventure Works Sales Model。若要執行這個範例中的程式碼,您必須已經將 AdventureWorks Sales Model 加入至專案中,而且將專案設定成使用 Entity Framework。若要這樣做,請完成 HOW TO:手動設定 Entity Framework 專案和 HOW TO:以手動方式定義 Entity Data Model (Entity Framework) 中的程序。
此結構描述內有定義五個實體:
Address
Contact
Product
SalesOrderDetail
SalesOrderHeader
下列步驟會實作用戶端應用程式,以及可執行資料模型的概念結構描述中對應至 GetOrderDetails
FunctionImport 的預存程序。該函式會擷取與指定之 SalesOrderHeader
相關的 SalesOrderDetail
實體 (此模型中的 FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID 關聯可執行與這個範例中相同的工作)。
若要在資料庫中建立預存程序
建立主控台應用程式。
加入 HOW TO:定義具有預存程序的模型 (Entity Framework)主題中實作之 dll 的參考。
加入 System.Data.Entity 和 System.Runtime.Serialization 的參考。
加入 HOW TO:定義具有預存程序的模型 (Entity Framework)中實作之 AdventureWorksModel 的前置處理器指示詞 (Preprocessor Directive)。
範例
此預存程序會搭配 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
另請參閱
工作
HOW TO:定義具有預存程序的模型 (Entity Framework)
概念
AdventureWorks Sales Model (EDM)
預存程序支援 (Entity Framework)
ModificationFunctionMapping (EntityTypeMapping)
ModificationFunctionMapping (AssociationSetMapping)