2014-03-14 35 views
2

我試圖將我的.NET項目切換到manage oracle以使部署更容易。不過,我在我的Win Server 2013環境測試中遇到以下錯誤:將.NET項目從非託管轉換爲託管的ODP.NET程序集的問題

無法確定類型爲'Oracle.ManagedDataAccess.Client.OracleConnection'的連接的提供程序名稱。

步驟我已經採取了迄今:

  1. 刪除了所有Oracle.DataAccess的DLL和從NuGet包管理器解決方案
  2. 添加了Oracle Data Provider for .NET (ODP.NET) Managed Driver
  3. 交換所有Imports Oracle.DataAccess語句到引用Imports Oracle.ManagedDataAccess

我沒有得到任何生成錯誤,並且項目運行良好loc盟友。但是,當部署到測試環境時,我得到這個錯誤。測試環境是Windows Server 2012,並且存在傳統的Oracle 11.2.0客戶端工具安裝。

這是我的連接創建代碼:

Public Sub New() 
    MyBase.New(
     New OracleConnection(
      ConfigurationManager.ConnectionStrings("Entities").ConnectionString), 
     True) 
End Sub 

這裏有3種不同風格的連接CONFIGS的,我已經試過(都工作在本地,但產量在測試環境相同的問題)

(格式化爲知名度)

<add 
     name="Entities" 
     connectionString=" 
      Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______))); 
      User Id=_____; 
      Password=_____;" 
     providerName="Oracle.ManagedDataAccess.Client" /> 

    <add 
     name="Entities" 
     connectionString=" 
      Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______))); 
      User Id=_____; 
      Password=_____;" 
     providerName="Oracle.DataAccess.Client" /> 

    <add 
     name="Entities" 
     connectionString=" 
      Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=###.###.###.###)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=______))); 
      User Id=_____; 
      Password=_____;" 
    /> 

任何幫助將不勝感激!

+0

提供程序名稱是在實體框架的上下文中使用的一段時間。 –

+0

您是否在服務器上安裝了OCI?你在服務器上運行ODP.Net安裝程序嗎?我發現我實際上不得不手動將一些DLL複製到bin文件夾中供Oracle使用,包括非託管的。 –

+0

@MauriceReeves我的目標是不必在服務器上安裝OCI,我認爲託管dll應該支持 –

回答

5

非官方的NuGet方法

使用託管實體框架的Oracle數據訪問,在Visual Studio 2012(.NET 4.5):

  1. 拉下Entity Framework 5.0.0.0

    Install-Package EntityFramework -Version 5.0.0

  2. 拉下來Oracle Data Provider for .NET (ODP.NET) Managed Driver

    Install-Package odp.net.managed

  3. 添加本節進行到配置文件

<system.data> 
    <DbProviderFactories> 
     <remove invariant="Oracle.ManagedDataAccess.Client" /> 
     <add name="ODP.NET, Managed Driver" 
      invariant="Oracle.ManagedDataAccess.Client" 
      description="Oracle Data Provider for .NET, Managed Driver" 
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 

,然後繼續像往常一樣。目前看來,實體框架6尚不支持Oracle.ManagedDataAccess,因此需要運行版本5.

另請注意,如果您使用的是Visual Studio 2010或更早版本,以.NET 4爲目標, NuGet將拉下EF5,但使用4.x程序集。我沒有在VS2010上用.NET 4測試過。

+0

問題是您正在使用由第三方(而不是Oracle)創建的非官方nuget軟件包。它沒有配置配置文件,因爲它應該。爲獲得最佳結果,請從otn.oracle.com/dotnet獲取ODP.NET。 XCOPY包裝包含一個腳本,它將修改目標的machine.config,並且可以根據需要修改它。該nuget包甚至可能沒有最新版本的錯誤修正等 –

+0

我很欣賞它的正式版本不正式發佈。在我的情況下,我不確定我們想要(或有)更改machine.config的權限,所以很高興知道我們仍然可以在app/web.config級別設置此選項。 –

+0

另外,看起來NuGet版本和直接oracle版本都是4.121.1.0 –

7

手冊下載方法

感謝@Christian爲吉文指出,管理ODAC的版本的NuGet不受Oracle

撰寫

使用託管實體框架的Oracle數據訪問,在Visual Studio 2012(.NET 4.5):

  1. 拉下Entity Framework 5.0.0.0

    Install-Package EntityFramework -Version 5.0.0

  2. 下載最新Oracle Data Access Components (ODAC)

  3. 手動參考Oracle.ManagedDataAccess.dll

  4. 添加本節進行到配置文件

<system.data> 
    <DbProviderFactories> 
     <remove invariant="Oracle.ManagedDataAccess.Client" /> 
     <add name="ODP.NET, Managed Driver" 
      invariant="Oracle.ManagedDataAccess.Client" 
      description="Oracle Data Provider for .NET, Managed Driver" 
      type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    </DbProviderFactories> 
    </system.data> 

,然後繼續像往常一樣。目前看來,實體框架6尚不支持Oracle.ManagedDataAccess,因此需要運行版本5.

另請注意,如果您使用的是Visual Studio 2010或更早版本,以.NET 4爲目標, NuGet將拉下EF5,但使用4.x程序集。我沒有在VS2010上用.NET 4測試過。

+2

我想我昨天意外地低估了這個。如果你可以請稍作修改,我就可以改爲upvote。 –

相關問題