.NET Entity Framework (with Oracle ODP.NET)


一、前言

1、Entity Framework是什么?

Entity Framework是微軟對ORM框架的實現。類似的實現也有其它方式,如DevExpress 的XPO(eXpress Persistant Object,非微軟公司的產品),都是比較有名的。如果時間來得及,后續會比較這兩個產品。下文簡稱EF。

2、為什么要用ORM

有數據庫編程經驗的人應該知道,程序中的對象模型很大程度來源於數據庫中的表,且有較強的對應關系(很多時候就是一個對應一個表)。建立這種對應關系,傳統的作法是:先在數據庫中建表T,再在程序中編寫類C,類中的屬性逐個對應表中的字段。系統運行時,數據操作層從數據庫中取出表記錄r,一條記錄去生成一個類對象o...

以上的種種過程總結起來就是:表和對象的相互關聯與轉化。

這里存在大量的機械化工作,是否可以由某種機制去代替這些太繁瑣的工作呢?有,這就是ORM存在的意義之一。除了效率外其它的好處還有:規范、簡潔、易維護...

3、在開始前,還有幾個重要概念,你必須要清楚。Code Frist?Database First?Model First?

這其實是編碼的幾種方式,理解起來也不復雜,基本上可以按照字面意思來理解。

Database First:如果數據庫表對象已經存在,EF 可以根據數據庫中的表及字段,建立POCO(Plain Old CLR Object,簡單理解為‘簡單類’,即沒有方法,僅有attribute和property的類)對象。簡言之,先有(更新)數據庫,再有(更新)類/對象

Model First :先建議Model,EF根據Model生成數據庫。

Code First:這種方式在MVC模式中非常流行,對於數據庫對象的修改完全通過代碼,而非手工去操作數據庫。本文中未使用這種方式,后續文章單獨講解。

具體差別,在下文中體會吧。

4、目的:本文包括如何使用EF、LINQ以及使用Model-First方式生成數據庫對象定義腳本。涉及Oracle數據庫、VisualStudio、ODP.NET。先從已有數據庫中,通過 Entity Data Model Wizard (studio中的向導)創建實體數據模型Entity Data Model (EDM),並通過三種方式來查詢EDM:

a、Linq   ;   b、含Lamda 表達式的 Linq ;  c、Entity SQL

5、環境准備

a、VisualStudio 2013 和.net framework 4.5以上

b、Oracle 11g release 2 以上

c、ODAC 12c Release 3 (12.1.0.2.1) 以上,可從Oracle官網下載。ODAC中含有為visual studio准備的開發者工具插件、ODT組件,這些在你安裝ODAC時就都有了。

d、本文中的數據庫HR,是Oracle的示例數據庫之一(除此之外還有OE、PM、IX、SH),Oracle官方的很多示例程序都基於此數據庫,建議安裝。可以從你的oracle安裝文件中找到($ORACLE_HOME/demo/schema),Oracle官網有,讀者也可自行百度,有問題可留言。如果你英文OK,也可直接瀏覽 https://docs.oracle.com/database/121/COMSC/installation.htm#COMSC001

e、這些文件files.zip下載備用(注意下載鏈接)

 二、准備工作

1、創建一個名稱為EntityFramework 的控制台應用程序 

2、創建實體數據模型Entity Data Model前,要用ODT創建Oracle連接

a、在Server Explorer中添加連接

b、注意,這里要用ODP.NET Managed 驅動,如圖

c、輸入你的數據庫連接信息,確保數據庫可以正常連接。

d、打開query window,復制以下腳本並執行。

e、在下載文件中找到三個存儲過程腳本文件:INCREASE_SALARY_BY_10UPDATE_AND_RETURN_SALARY 和 OUTPARAM,拷到Query Window 中執行。確保新添加的存儲過程出現在Procedure節點中

三、使用向導創建EDM

a、在項目上點擊右鍵,選擇‘Add New Item’

b、在向導中選擇‘EF Designer from Database’,並選擇下一步

c、注意選擇數據庫連接,選中保存敏感信息(數據庫密碼),並將連接設置保存在app.config中,如圖:

d、注意選擇表對象: DEPARTMENTS 和 EMPLOYEES ,三個存儲過程對象: INCREASE_SALARY_BY_10 , UPDATE_AND_RETURN_SALARY 以及 OUTPARAM 

四、三種方式進行EDM查詢

1、使用LINQ查詢

a、添加 System.Data.Entity 引用

b、在Program.cs文件中,編寫如下代碼

e、編譯執行結果如下:

注意,如果系統編譯錯誤、數據連接錯誤,請按如下步驟檢查

a、如果出現錯誤:Error 66 Argument 10: cannot convert from 'System.Data.Objects.ObjectParameter' to 'System.Data.Entity.Core.Objects.ObjectParameter' D:\Aziz\Aziz Project\Development\Running Development\Web\pos\pos\Model1.Context.cs 351 278 pos

問題產生的原因:你使用了Entity Framework 6 

解決辦法是:在context.cs文件中,修改命名空間,如下圖:

以上問題,如果使用Entity Framework 5則不會出現

b、如果出現數據連接錯誤,則修改app.config如下:

在entityFramework配置節中,修改provider配置

<providers>
<!--<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />-->
<provider invariantName="Oracle.ManagedDataAccess.Client"
type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.122.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
</providers>

c、打開NuGet,為項目添加ODP.NET

 2、通過 lambda 表達式和 存儲過程映射執行LINQ查詢

LINQ查詢可含有Lambda表達式。Lambda表達式可作為LINQ各種標准查詢方法的參數。通過將 Oracle 存儲過程映射到 EDM 中的更新、插入和刪除操作,可以對實體執行這些操作。

本部分將對 EMPLOYEE 實體執行一個使用 lambda 表達式的 LINQ 查詢,然后映射一個存儲過程以對所有選出的行執行更新操作。這將使用之前導入到 EDM 中的一個存儲過程。

 a、首先,需要創建要更新的數據對象與存儲過程的映射(mapping)關系。當.NET要試圖更新數據時,映射的存儲過程會對LINQ選出的數據行進行更行。打開HRModel.edmx,並打開Model Browser.

b、在 HRModel.edmx 中,右鍵單擊 EMPLOYEES 實體並選擇 Stored Procedure Mapping

c、在 Mapping Details - EMPLOYEE 窗口中,選擇 <Select Update Function>,然后選擇 INCREASE_SALARY_BY_10 存儲過程。

d、在實體和 Oracle 數據庫之間建立參數數據類型映射。從下拉列表中選擇 EMPLOYEE_ID 作為 ID,選擇 SALARY 作為 SAL

e、鍵入下圖中高亮顯示的代碼,或在 Programcs.txt 中復制以 LINQ using lambda expressions -- 開頭的代碼塊,然后粘貼到 Program.cs 中已有代碼語句的后面。單擊 (啟動調試)

在應用程序中,注意到 result.SALARY 設置為 18000。實際上,Entity Framework 執行的存儲過程將工資增加了 10。在下一部分中,您將對這些行執行查詢,以證明工資的確增加了 10。其實,實現了類似傳統意義上的數據庫觸發器的效果。

注:在查看了第一個結果集之后,按 Enter 鍵繼續。

3、執行Entity SQL 查詢

在本部分中,將查詢與前一部分相同的行,來證明存儲過程已成功更新這些行。將使用 Entity Framework 中的另一種查詢方法 Entity SQL 進行查詢。

鍵入下圖中高亮顯示的代碼,或在 Programcs.txt 中復制以 Entity SQL -- 開頭的代碼塊,然后粘貼到 Program.cs 中已有代碼語句的后面。單擊 (啟動調試),查看工資增加 10 的更新結果。

注:查看輸出之后,按兩下 Enter 繼續。

 五、函數導入和隱式結果集檢索 | 直接插入和更新數據

通過 Entity Framework,開發人員能夠定義自己的 .NET 方法來執行數據庫存儲過程。具體做法是在概念模型中創建函數導入,並將其映射到存儲過程。本部分將定義自己的方法並映射到 Oracle 存儲過程,用以執行更新。該存儲過程還將使用一個隱式結果集返回修改后的數據。開發人員在 .NET 配置文件中定義結果集元數據,以便 Entity Framework 正確檢索數據。

本部分介紹如何在 Entity Framework 中以編程方式修改 Oracle 數據庫數據。並將對 DEPARTMENTS 表執行插入和刪除操作。

1、您將使用 Visual Studio 的函數導入工具將存儲過程映射到用戶定義的 .NET 方法。由於存儲過程返回一個隱式結果集,因此在使用該工具之前,需要通過向導在 .NET 配置文件中定義結果集元數據。在Server Explorer中找到存儲過程 UPDATE_AND_RETURN_SALARY ,右鍵,選擇 RUN .

2、打開Run Procedure 窗口。界面參數保持默認,不做修改。

3、存儲過程執行成功。在Out Parameters中,為New_SALARY選中‘Select For Config’

4、點‘Show Config’,預覽出即將要添加到App.config中的配置信息,包括返回數據集、列等元數據信息;點‘AddConfig’按鈕,則將預覽窗口的信息添加到App.config中。

5、App.config中添加上了refCursor信息

6、接下來,將使用函數導入工具把一個 .NET 方法映射到 Oracle 存儲過程。右鍵單擊 HRModel.edmx 並選擇 Model Browser。

7、在 Model Browser 中,依次展開 HRModel.Store 和 Stored Procedures 節點。選擇 UPDATE_AND_RETURN_SALARY 存儲過程。之前在創建 EDM 時導入了該存儲過程

8、右鍵單擊 UPDATE_AND_RETURN_SALARY 並選擇 Add Function Import。

6、在 Add Function Import 窗口中,選擇 Returns a Collection Of 部分中的 Complex。存儲過程所返回的結果集中僅包含兩列,而不是完整定義的實體或標量值。

單擊 Get Column Information。將從 .NET 配置文件中檢索列信息。

7、依次點擊Create New Complex Type OK 按鈕

在程序中將使用默認的 UPDATE_AND_RETURN_SALARY 函數名來調用此方法

8、在Program.cs文件中輸入如下代碼。注意,上下文件Context中已經有UPDATE_AND_RETURN_SALARY 這個方法了,調用此方法將調用映射的存儲過程,並返回數據集。

9、運行程序,顯示人員姓名和更改后的薪資。

 六、從存儲過程中獲傳出型參數值

本部分驗證如何從存儲過程中獲取output 型的參數值。傳出型的參數只需要在.Net中顯式聲名並映射到存儲過程的Output Parameter。這不同於以往的EF版本中的使用導入函數的方式來獲取傳出參數。

1、打開Program.cs文件,鍵入如下代碼。注意,entity context 擁有方法 OUTPARAM。ObjectParameter 對象被作為OUTPARAM方法的參數,與方法的傳出型參數綁定。

程序運行結果如下:

七、使用LINQ進行數據插入、刪除操作

本部分論證如何以編碼方式使用LINQ進行插入、刪除等操作

1、在Program.cs中鍵入如下代碼。注釋已說明了每段代碼的操作

2、運行結果如下:

八、Model-First

本部分將在EMPLOYEE實體添加一個屬性。為了能在數據庫表中添加上相應列,Visual Studio將生成Oracle 的DDL腳本。這些腳本能夠在Oracle 數據庫中運行並更新表。

1、在HRModel.edm中,為EMPLOYEE實體添加新屬性,名稱為ADDRESS

2、在模型瀏覽窗口右鍵點擊Model,選擇Properties,做如下更改:將屬性Database Schema Name 改為 HR  ,將屬性DDL Generation Template 設為SSDLtoOracle.tt (VS) ,將屬性Database Generation Workflow 設為Generate Oracle via T4(TPT).xaml (VS)

3、右鍵 HRModel.edmx 選擇 Generate Database from Model 菜單項

4、接下來的彈出窗口中點OK

5、數據庫向導生成了DDL腳本,這些腳本可單獨保存成文件,單獨運行。注意:腳本能夠創建和刪除數據庫對象。默認地,刪除腳本被注釋掉了。如果你想使用,可以執行前取消注釋。

九、總結

本文涉及如下內容:

1、創建Oracle Connection

2、使用向導創建實體數據模型Entity Dtata Model

3、三種方式檢索查詢Entity Framework Data

4、映射存儲過程到EDMs

5、使用函數導入功能( Entity Framework Function Imports )創建與存儲過程映射的函數

6、存儲過程的傳出參數的檢索方法

7、編碼方式修改Entity Framework data

8、以Model-First方式生成DDL腳本,並修改數據庫對象

 

下一篇文章,我將介紹Code First的實現方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM