You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用EF5连接Oracle遇.NET数据提供程序未找到错误求助

解决方案:EF5连接Oracle时找不到数据提供程序的问题

这个问题我之前帮不少开发者排查过,核心原因是EF5无法找到匹配版本的Oracle数据提供程序,再加上你环境里GAC中的旧版DLL和ODAC安装的新版DLL存在冲突,导致provider无法被正确加载。下面是一步步的解决步骤:

1. 修正配置文件的DbProviderFactories配置

首先确保你的app.configweb.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 LocalTrue——这样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客户端安装,能避免很多版本冲突问题,推荐尝试:

  1. 引用ODAC路径下的Oracle.ManagedDataAccess.dll(同样设置Copy LocalTrue
  2. 修改配置文件的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>
  1. 更新你的数据库连接字符串,指定使用托管驱动:
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

火山引擎 最新活动