1

我开发了一个使用实体框架访问 Oracle 数据库的新应用程序。使用最新版本的 ODP.NET,这在本地按预期工作。我现在正尝试将此应用程序部署在运行许多其他遗留应用程序的生产服务器上。理想情况下,我希望我的新应用程序能够使用它自己的 ODP.NET / Oracle dll,而不必更改产品服务器上现有的 Oracle 安装。

我遵循了本指南:

http://jeremybranham.wordpress.com/2011/04/25/oracle-instant-client-with-odp-net/

根据评论,这似乎取得了一些成功。

但是,尝试创建实体对象时出现以下异常:

外部异常

Exception has been thrown by the target of an invocation.

内部异常

The type initializer for 'Oracle.DataAccess.Client.OracleClientFactory' threw an exception.
at System.RuntimeFieldHandle.GetValue(RtFieldInfo field, Object instance, RuntimeType fieldType, RuntimeType declaringType, Boolean& domainInitialized)
at System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency)
at System.Reflection.RtFieldInfo.GetValue(Object obj)
at System.Data.Common.DbProviderFactories.GetFactory(DataRow providerRow)
at System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName)
at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
at System.Data.EntityClient.EntityConnection.ChangeConnectionString(String newConnectionString)
at System.Data.EntityClient.EntityConnection..ctor(String connectionString)
at System.Data.Objects.ObjectContext.CreateEntityConnection(String connectionString)
at System.Data.Objects.ObjectContext..ctor(String connectionString, String defaultContainerName)
at MyAppMVC.Models.DataModels.STSProcedureEntities..ctor()
at MyAppMVC.Services.MyService.GetPersons(String lastName)
4

2 回答 2

2

尽管您似乎通过安装额外的客户端解决了您的问题,但您可能已经在 app / web.config 文件中添加了以下配置。

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

并将二进制文件放在本地 bin 文件夹中。

于 2013-01-23T13:44:09.273 回答
1

在这里回答我自己的问题。我们最终安装了 Oracle 的第二个版本,使用将新版本放入 client_2 文件夹的默认设置。

  • D:\oracle\product\11.2.0\client(旧版)
  • D:\oracle\product\11.2.0\client_2(新版本)

唯一的附加安装步骤是将之前的 TNSNAMES.ORA 文件放入新的 client_2 中。该文件使用上面的文件路径位于 client\network\admin 中。

因为我们所有的应用程序都设置为专门寻找其正确的 Oracle 版本 (SpecificVersion=true),所以大部分工作都无需修改。对于那些没有的,我们必须将旧版本的 Oracle.DataAccess.dll(来自客户端,而不是 client_2)放入该应用程序的 bin 文件夹中。

于 2013-01-22T15:35:23.620 回答