【问题标题】:Problems switching .NET project from unmanaged to managed ODP.NET assemblies将 .NET 项目从非托管切换到托管 ODP.NET 程序集时出现问题
【发布时间】:2014-04-19 03:41:58
【问题描述】:

我正在尝试将我的 .NET 项目切换到管理 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

我没有收到任何构建错误,并且项目在本地运行良好。但是,当部署到测试环境时,我收到此错误。测试环境是 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=_____;"
   />

任何帮助将不胜感激!

【问题讨论】:

  • 提供者名称在实体框架的上下文中使用了一段时间。
  • 服务器上是否安装了OCI?您是否在服务器上运行过 ODP.Net 安装程序?我发现我实际上必须手动将一些 DLL 复制到 bin 文件夹中,以便 Oracle 工作,包括非托管的。
  • @MauriceReeves 我的目标是不必在服务器上安装 OCI,我认为托管 dll 应该支持

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


【解决方案1】:

手动下载方式

感谢 @Christian Shay 指出 NuGet 版本的托管 ODAC 不是由 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. 将此部分添加到配置文件中

  <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 程序集。我没有在 VS2010 上用 .NET 4 测试过这个。

【讨论】:

  • 我想我昨天不小心投了反对票。如果您可以对其进行小幅修改,我将能够改为投票。
【解决方案2】:

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

  <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 程序集。我没有在 VS2010 上用 .NET 4 测试过这个。

【讨论】:

  • 问题是您使用的是由第三方(不是 Oracle)创建的非官方 nuget 包。它没有按应有的方式配置配置文件。为获得最佳结果,请改为从 otn.oracle.com/dotnet 获取 ODP.NET。 XCOPY 打包包含一个脚本,该脚本将修改目标的 machine.config,您可以根据需要对其进行修改。该 nuget 包甚至可能没有带有错误修复等的最新版本。
  • 我很感激它不是官方版本。在我的情况下,我不确定我们是否想要(或拥有)更改 machine.config 的权限,所以很高兴知道我们仍然可以选择在 app/web.config 级别进行设置。
  • 另外,看来NuGet版本和直接oracle版本都是4.121.1.0
  • nuget 网页显示它最后一次更新是在 8 月。我们在 12 月发布了版本 12.1.0.1.2。检查 DLL 日期。 Oracle 最终会从 otn.oracle.com 下载一个官方的 nuget 包,但我们无法将它放到 nuget.org。
  • Tom,从这个 12 月版本开始,即使 DLL 已更新,我们也无法再修改版本号的第 5 位数字。滚动到此链接的页面底部:docs.oracle.com/cd/E51173_01/win.122/e17732/… 并阅读有关使用 .NET Framework System.Diagnostics.FileVersionInfo.ProductVersion 属性获取真实版本号的信息。
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2011-03-13
  • 2015-09-24
  • 2012-01-24
  • 2016-12-12
  • 2018-03-19
相关资源
最近更新 更多