【发布时间】:2015-12-27 22:01:22
【问题描述】:
我正在尝试使用 EF4 为 Oracle 数据库创建示例项目。
在我的电脑上我创建了一个项目。
一些特性(如果需要更多信息,请说出来)
- Visual Studio 2010
- 带有 DB First + DbContext 的实体框架 4.1
- 平台目标“任何 CPU”
- Oracle BD 11g
- 我的数据库连接是使用“服务器资源管理器”->“数据连接”->“Oracle Data Provider for .NET”创建的
- 我有一个带有 client_32 和 client_64 文件夹的 Oracle Home 11.2
- 我没有在我的项目中引用 Oracle.DataAccess.Client
- 在我的 GAC 中,我发现 Oracle.DataAccess 与 2.112.3.0 x86、2.112.1.0 x86、2.112.4.0 AMD64、2.112.3.0 AMD64、2.112.1.0 AMD 64
- 列出我得到的电脑供应商
- Odbc 数据提供程序版本=4.0.0.0
- OleDb 数据提供程序版本=4.0.0.0
- OracleClient 数据提供程序版本=4.0.0.0
- SqlClient 数据提供程序版本=4.0.0.0
- .NET 版本 = 4.112.4.0 的 Oracle 数据提供程序
- Microsoft SQL Server Compact 数据提供程序版本=3.5.1.0
- Microsoft SQL Server Compact 数据提供程序 4.0 版本=4.0.0.0
在我的电脑上运行项目(使用 EF 生成的实体之一进行简单的添加),工作正常。
服务器:
- Windows Server 2008 R2 标准版
- app64/32 中的 1 个 Oracle 主目录,与 11.2 相比
- 我所有的 IIS AppPool 都可以运行 32 位
- 在 GAC 中,我有 Oracle.DataAccess 2.112.1.0 x86 和 AMD64
- 列出我可以看到的供应商
- Odbc 数据提供程序版本=4.0.0.0
- OleDb 数据提供程序版本=4.0.0.0
- OracleClient 数据提供程序版本=4.0.0.0
- SqlClient 数据提供程序版本=4.0.0.0
在服务器上运行程序时,我收到以下错误:“[ArgumentException: Unable to find the requested .Net Framework Data Provider. It may not be installed.] System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName)"
查看提供程序后,我意识到服务器中缺少提供程序“Oracle Data Provider for .NET”,因此我尝试了多个 oracle 安装(ODAC、ODP、XCopy),但似乎没有任何效果,尽管安装了几个文件(我使用了现有的 oracle home),提供程序一直没有显示,在注册表中,在 SOFTWARE\ORACLE\ODP.NET 下我一直只看到 2.112.1.0 版本。
在此之后,我尝试使用 oracle DLL 部署我的 exe,甚至将 app.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=4.112.3.0, Culture=neutral,
PublicKeyToken=89b483f429c47342"/>
</DbProviderFactories>
但我收到以下错误:System.Data.EntityException:底层提供程序在打开时失败 -> Oracle.DataAccess.Client.OracleException:ORA-12557:TNS:协议适配器不可加载。
搜索错误并在某处发现我应该尝试 EZConnect 表单 (user/pass@host:port/sid) 但随后出现配置异常...
截至目前,使用 oracle 运行的其他应用程序(我看不到它们是如何运行的)停止工作,所以我必须在所有安装之前返回...
我已经在这里呆了 3 天了,我真的不知道该怎么办。服务器恢复后,有人知道我还能尝试什么吗?
========================= 更新1 ==================== =============
在我的服务器恢复到这一切之前,我发现了一些我忘记检查的东西
在注册表中我有:
- HKEY_LOCAL_MACINE/SOFTWARE/ORACLE/KEY_OraClient11g_home1/ORACLE_HOME -> D:\app64\product\11.2.0
显然,我的 oracle 东西是 64 位的,所以我的下一步是将我的程序更改为 64 位。这导致了同样的错误,之后我认为我需要安装 64 位 ODAC。我下载了 ODAC112021Xcopy_x64 并安装了它。随之出现 .NET 版本的 Oracle 数据提供程序(但版本为 4.112.2.0)。现在运行我的应用程序会出现以下错误:
系统数据。提供者不兼容异常:商店提供者工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvider 接口
搜索错误后,我检查了 GAC64 位。我可以在 C:\Windows\Microsoft.NET\assembly\GAC_64\Oracle.DataAccess\v4.0_4.112.2.0__89b483f429c47342 中看到 oracle.dataaccess.dll。
我的下一步应该是什么?卸载此 odac 并尝试更新版本的 11?阅读这篇文章 (http://netdevelopmentmanfreddahmen.blogspot.pt/2013/07/c-error-store-provider-factory-type.html),对于 EF,您似乎需要 112.3.0 或更高版本以及 .Net 4 或更高版本
你猜怎么着?灿南!!成功了:)
好消息是,安装此 ODAC 并没有影响(据我所知)剩余的和已经使用 oracle 运行的应用程序。
注意:我使用命令 install.bat all D:\app64\produc 安装了 ODAC t\11.2.0 Oracle - OraClient11g_home1
【问题讨论】:
-
根据您的需要,您可能会发现仅使用 ODP.NET 托管驱动程序 (Oracle.ManagedDataAccess.dll) 会更容易。如果这是一个学校项目或家庭培训,我会从那里开始。您得到的 ORA 错误非常极端。这表明您没有成功安装整个非托管堆栈。
-
Hy @ChristianShay 不幸的是这是工作 :( 我做了一些更新,看看是否能让任何事情更清楚
-
嗨@ChristianShay 成功了。谢谢你的帮助:)
标签: c# entity-framework oracle11g odp.net