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

Tom*_*day 2 .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)托管驱动程序
  3. 将所有Imports Oracle.DataAccess陈述转换为Imports Oracle.ManagedDataAccess

我没有得到任何构建错误,并且项目在本地运行良好.但是,当部署到测试环境时,我收到此错误.测试环境是Windows Server 2012,并且安装了旧的Oracle 11.2.0客户端工具.

这是我的连接创建代码:

Public Sub New()
    MyBase.New(
        New OracleConnection(
            ConfigurationManager.ConnectionStrings("Entities").ConnectionString),
        True)
End Sub
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过的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=_____;"
   />
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Tom*_*day 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数据访问组件(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>
Run Code Online (Sandbox Code Playgroud)

然后像往常一样继续.此时似乎Entity Framework 6还不支持Oracle.ManagedDataAccess,因此必须运行第5版.

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

  • 我想我昨天不小心贬低了这个.如果你可以请对它做一个小的编辑,我将能够提升. (2认同)

Tom*_*day 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)托管驱动程序

    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>
Run Code Online (Sandbox Code Playgroud)

然后像往常一样继续.此时似乎Entity Framework 6还不支持Oracle.ManagedDataAccess,因此必须运行第5版.

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