本文主要說明如何在Entity Framework 5.0.0中使用Function Import,以及使用ODP.NET的 Implicit REF CURSOR Binding功能。
概要:1,明如何使用Entity Framework中的function import功能。
2,說明如何使用ODP.NET的隱式REF CURSOR綁定(implicit REF CURSOR binding)。
環境以及工具:
Windows 10 企業版
Microsoft Visual Studio Enterprise 2015
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
.NET Framework 4.0
ODP.NET(Nuget Package Id: Oracle.ManagedDataAccess; Nuget Package Version: 12.1.2400)
Entity Framework(Nuget Package Id: EntityFramework; Nuget Package Version: 5.0.0)
其他要求:Oracle資料庫中的HR schema訪問許可權。
1,創建一個Winform項目名稱為FunctionImportTest,.NET版本是4.0。
2, 打開Nuget Package Manager控制台。
依次執行如下兩個命令分別安裝EF和ODP.NET的包:
install-package -id EntityFramework -version 5.0.0 -projectname FunctionImportTest
install-package -id Oracle.ManagedDataAccess -projectname FunctionImportTest
3,在Oracle資料庫中的HR方案裡面創建一個存儲過程。
此存儲過程有一個類型為隱式游標變數的出參。
1 CREATE OR REPLACE PROCEDURE "HR"."PROC_GET_EMP_BY_DEPT_NAME" 2 ( 3 DEPT_NAME IN VARCHAR2 DEFAULT NULL, 4 CUR_EMPS OUT SYS_REFCURSOR 5 ) AS 6 SQL_STMT VARCHAR2(256) := 'SELECT t1.first_name, t1.last_name, t2.department_name FROM employees t1 ' || 7 'JOIN departments t2 ON t1.department_id = t2.department_id '; 8 BEGIN 9 IF DEPT_NAME IS NOT NULL THEN 10 SQL_STMT := SQL_STMT || 'WHERE t2.department_name = ' || '''' || DEPT_NAME || ''''; 11 END IF; 12 13 OPEN CUR_EMPS FOR SQL_STMT; 14 END "PROC_GET_EMP_BY_DEPT_NAME";
4,從資料庫生成概念模型
(1),在項目名稱上點擊右鍵,選擇Add-->Add Item。選擇ADO.NET Entity Data Model,並把Name設置為HRModel,然後點擊Add。
(2),選擇從資料庫生成模型,點擊NEXT。
(3),選擇資料庫連接。本文使用Oracle資料庫中的HR方案。
(4),選擇Entity Framework版本。
(5),選擇資料庫對象及設置。選擇上文已經創建的HR.PROC_GET_EMP_BY_DEPT_NAME存儲過程,並點擊FINISH。
5,此時已經導入了Oracle中的存儲過程。然後把存儲過程的出參CUR_EMPS映射為具體的類。
導入之後的樣子如下圖所示:
6,配置app.config文件,設置存儲過程的隱式游標參數的元數據信息。
以下是app.config文件中oracle.manageddataaccess.client部分的配置。在設置屬性值時,VS基本都有提示。
1 <oracle.manageddataaccess.client> 2 <version number="*"> 3 <dataSources> 4 <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " /> 5 </dataSources> 6 <implicitRefCursor> 7 <!-- 8 註意:方案名稱和存儲過程的名稱是大小寫敏感的。 9 如果要保留方案名稱和存儲過程名稱中的小寫字母,則添加"。 10 例如<storedProcedure schema=""SchemaName"" name=""StoredProcedureName""> 11 否則,EF框架會預設把這些名稱轉換為大寫形式。 12 --> 13 <storedProcedure schema="HR" name="PROC_GET_EMP_BY_DEPT_NAME"> 14 <!-- 游標參數的名稱是大小寫敏感的。 --> 15 <refCursor name="CUR_EMPS"> 16 <bindInfo mode="Output"/> 17 <!-- 參數的序數從0開始 --> 18 <metadata columnName="FIRST_NAME" columnOrdinal="0" columnSize="20" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" /> 19 <metadata columnName="LAST_NAME" columnOrdinal="1" columnSize="25" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" /> 20 <metadata columnName="DEPARTMENT_NAME" columnOrdinal="2" columnSize="30" nativeDataType="Varchar2" providerType="Varchar2" providerDBType="String" dataType="System.String" /> 21 </refCursor> 22 </storedProcedure> 23 </implicitRefCursor> 24 </version> 25 </oracle.manageddataaccess.client>
7,把函數導入映射為類型。
(1),修改function import。切換到Model Browser視窗。在Function Imports下麵剛纔導入的存儲過程名稱上點擊右鍵,然後點擊Edit。
(2),修改function import,並生成Complext Type。
① 修改Function Import Name。
② 選擇Returns a Collection Of下麵的Complex。
③ 點擊Get Column Information。
④ 點擊Create New Complex Type。
⑤ 把Complex Type的名稱修改為EmployeeBasicInfo。
⑥ 點擊OK。
此時,Complex Types下麵多了一個類型。
8,調用GetEmpByDeptName方法獲取數據,然後和DataGridView控制項綁定,把數據顯示出來。