我开发了一个使用Entity Framework访问Oracle数据库的新应用程序。这在本地使用最新版本的ODP.NET正常工作。我现在正尝试在运行许多其他遗留应用程序的生产服务器上部署此应用程序。理想情况下,我希望我的新应用程序能够使用自己的ODP.NET / Oracle dll,而不必更改prod服务器上现有的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)
答案 0 :(得分: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文件夹中。
答案 1 :(得分:1)
在这里回答我自己的问题。我们最终安装了第二个版本的Oracle,使用默认设置将新版本放入client_2文件夹。
唯一的额外安装步骤是将之前的TNSNAMES.ORA文件放入新的client_2中。此文件位于client \ network \ admin中,使用上面的文件路径。
因为我们所有的应用程序都设置为专门寻找他们正确的Oracle版本(SpecificVersion = true),所以一切都在没有修改的情况下工作。对于那些没有的人,我们不得不将旧版本的Oracle.DataAccess.dll(从客户端,而不是client_2)放入该应用程序的bin文件夹中。