使用EF5连接Oracle遇.NET数据提供程序未找到错误求助
这个问题我之前帮不少开发者排查过,核心原因是EF5无法找到匹配版本的Oracle数据提供程序,再加上你环境里GAC中的旧版DLL和ODAC安装的新版DLL存在冲突,导致provider无法被正确加载。下面是一步步的解决步骤:
1. 修正配置文件的DbProviderFactories配置
首先确保你的app.config或web.config中,正确注册了对应版本的Oracle数据提供程序,并且移除可能冲突的旧条目:
<system.data> <DbProviderFactories> <!-- 先移除已有的Oracle provider,避免冲突 --> <remove invariant="Oracle.DataAccess.Client" /> <!-- 添加ODAC安装的4.1版本对应的provider --> <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.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data>
注意:版本号要和你ODAC路径下的Oracle.DataAccess.dll版本完全一致,PublicKeyToken固定为89b483f429c47342。
2. 确保项目引用正确的Oracle DLL
不要引用GAC中的旧版Oracle.DataAccess.dll,直接从ODAC安装路径(C:\app\client\MachineName\product\12.1.0\client_1\odp.net\bin\4\)添加对Oracle.DataAccess.dll的引用,并在引用属性中设置Copy Local为True——这样DLL会被复制到项目输出目录,避免GAC版本的干扰。
3. 处理GAC版本冲突(可选但推荐)
如果GAC中的旧版DLL仍然造成干扰,可以在配置文件中添加程序集绑定重定向,强制使用新版DLL:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <!-- 将旧版本2.112.1.0重定向到你使用的新版本 --> <bindingRedirect oldVersion="2.112.1.0" newVersion="4.121.2.0" /> </dependentAssembly> </assemblyBinding> </runtime>
4. 切换到托管版Oracle驱动(更稳定的方案)
托管版Oracle.ManagedDataAccess.dll不需要依赖Oracle客户端安装,能避免很多版本冲突问题,推荐尝试:
- 引用ODAC路径下的
Oracle.ManagedDataAccess.dll(同样设置Copy Local为True) - 修改配置文件的
DbProviderFactories为托管版本:
<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.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data>
- 更新你的数据库连接字符串,指定使用托管驱动:
Data Source=你的Oracle数据源;User Id=用户名;Password=密码;Provider=Oracle.ManagedDataAccess.Client;
5. 验证EF的Provider配置
如果使用Code First或EF的数据库优先模式,确保entityFramework节点中注册了对应版本的Oracle EF provider:
<entityFramework> <providers> <!-- 非托管版 --> <provider invariantName="Oracle.DataAccess.Client" type="Oracle.DataAccess.EntityFramework.EFOracleProviderServices, Oracle.DataAccess.EntityFramework, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> <!-- 如果用托管版,替换为下面的条目 --> <!-- <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> --> </providers> </entityFramework>
注意:Oracle.DataAccess.EntityFramework.dll(或托管版的对应DLL)也要从ODAC的odp.net\ef\bin\4\路径引用,版本保持一致。
内容的提问来源于stack exchange,提问作者Hemendra




