将.NET项目从非托管ODP.NET程序集切换到托管ODP.NET程序集的问题

时间:2014-03-14 02:24:40

标签: .net oracle odp.net iis-8 odp.net-managed

我试图将我的.NET项目切换到manage oracle以使部署更容易。但是,我在测试Win Server 2013环境中收到以下错误:

无法确定类型' Oracle.ManagedDataAccess.Client.OracleConnection'的连接的提供商名称。

到目前为止我采取的措施:

  1. 删除了所有Oracle.DataAccess dll以及解决方案中的参考资料
  2. 在NuGet包管理器中添加了Oracle Data Provider for .NET (ODP.NET) Managed Driver
  3. 将所有Imports Oracle.DataAccess语句切换为Imports Oracle.ManagedDataAccess
  4. 我没有收到任何构建错误,项目在本地运行良好。但是,当部署到测试环境时,我收到此错误。测试环境是Windows Server 2012,并且安装了旧的Oracle 11.2.0客户端工具。

    这是我的连接创建代码:

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

    以下是我尝试过的3种不同风格的连接配置(两种都在本地工作,但在测试环境中产生同样的问题)

    (为可见性而格式化)

      <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=_____;"
       />
    

    非常感谢任何帮助!

2 个答案:

答案 0 :(得分:7)

手动下载方法

感谢@Christian Shay指出Managed ODAC的NuGet版本不是由Oracle创作的

在Visual Studio 2012(.NET 4.5)中使用托管Oracle数据访问和实体框架:

  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. 将此部分添加到配置文件

  5.   <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>
    

    然后像往常一样继续。目前看来Entity Framework 6还不支持Oracle.ManagedDataAccess,因此必须运行第5版。

    另请注意,如果您使用的是Visual Studio 2010或更早版本,以.NET 4为目标,NuGet将下拉EF5,但使用4.x程序集。我没有使用.NET 4在VS2010上测试过这个。

答案 1 :(得分:5)

非官方NuGet方法

在Visual Studio 2012(.NET 4.5)中使用托管Oracle数据访问和实体框架:

  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. 将此部分添加到配置文件

  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>
    

    然后像往常一样继续。目前看来Entity Framework 6还不支持Oracle.ManagedDataAccess,因此必须运行第5版。

    另请注意,如果您使用的是Visual Studio 2010或更早版本,以.NET 4为目标,NuGet将下拉EF5,但使用4.x程序集。我没有使用.NET 4在VS2010上测试过这个。