在2008/2012 Server 上使用Entity Framework連結Oracle 讀取任意 Entity 失敗的問題解決辦法

先前至客戶端進行 Framework 開發的顧問服務與教育訓練時,由於客戶使用 Entity Framework 5.x 連結 Oracle 資料庫,不過實際部署時,卻發生問題,但是 Server 2008 R2 商都已經安裝了需要的 x64 版本的 Oracle Client,而且Entity Framework 5.x 所需要的相關 DLL 檔案也都放置在 bin 中,可是,Web API 的網站卻就是無法執行

前言

先前至客戶端進行 Framework 開發的顧問服務與教育訓練時,由於客戶使用 Entity Framework 5.x 連結 Oracle 資料庫,不過實際部署時,卻發生問題,但是 Server 2008 R2 商都已經安裝了需要的 x64 版本的 Oracle Client,而且Entity Framework 5.x 所需要的相關 DLL 檔案也都放置在 bin 中,可是,Web API 的網站卻就是無法執行,只要任意撈一個 Entity,即會出現如下錯誤訊息。

image

 

根據訊息的說明,因為系統並未註冊供.NET Framework 標準使用的資料提供者 Data Provider,我們知道,微軟早在幾年前就不再開發、維護 Oracle 的 .NET Framework Data Provider 了,這也表示說,你的系統就算安裝了 Oracle Open Client 後,你的系統內也不會有 For Oracle 的 .NET Framework Data Provider,所謂的.NET Framework Data Provider 就是 Managed 版的資料提供者,在 .NET 3.5之前,我們還可以像下面這樣來使用 Oracle:

image

到了.NET 4.0 之後,你到 MSDN 網站查詢 Oracle 與 ADO.NET,微軟會告訴你『System.Data.OracleClient  中的型別已被取代。  目前版本的 .NET Framework 仍然支援這些型別,不過未來的版本就會將其移除。  Microsoft 建議您使用協力廠商的 Oracle 提供者。』

image

 

當然,現階段微軟或許還不會將 System.Data.OracleClient 命名空間移除,但未來就很難說,但是我覺得重點應該是在於 Oracle 更新版本的速度過快,微軟更新的速度絕對比不上 Oracle 官方資料庫更新的速度,將它開放給協力廠商自行維護也比較能確保與自家的資料庫版本更新處於同步狀態,不會像以前使用 System.Data.OracleClient 時會有一些 DataType 不支援的問題。

 

問題與解決方式:

此問題的發生就在於 Managed 版本的 .NET Framework Data Provider 並未註冊在 Server 2008 R2 上 (包含 Entity Client),必須到到Oracle官方網站下載64-bit Oracle Data Access Components (ODAC) 的ODP.NET_Managed121012.zip安裝檔案,如下圖:

image

連結如下:

http://www.oracle.com/partners/campaign/index-090165.html

將其解壓縮出來,並確定x64的資料夾內有下列檔案 (建議解壓縮在UserProfile的資歷夾中)

image

接著請以管理員Administrator啟動命令提示字元,並切換到x64的資料夾中

執行 configure.bat

image

它會註冊.NET Framework Data Provider for Oracle 根據Entity Framwork會使用到的相關XSD Schema等檔案,並複製Oracle.ManagedDataAcces.Client相關DLL到指定目錄,與註冊一些Register Key的資訊。從圖中可以發現其中一個oracle.manageddataaccessdtc.dll會註冊到GAC中,這也是影響我們無法執行的主要原因之一。

 

完畢後,程式隨即可以執行

image


 

簽名:

學習是一趟奇妙的旅程

這當中,有辛苦、有心酸、也有成果。有時也會有瓶頸。要能夠繼續勇往直前就必須保有一顆最熱誠的心。

軟體開發之路(FB 社團)https://www.facebook.com/groups/361804473860062/

Gelis 程式設計訓練營(粉絲團)https://www.facebook.com/gelis.dev.learning/


 

如果文章對您有用,幫我點一下讚,或是點一下『我要推薦,這會讓我更有動力的為各位讀者撰寫下一篇文章。

非常謝謝各位的支持與愛護,小弟在此位各位說聲謝謝!!! ^_^