无法将EntityFramework连接到DB2 Provider的迁移适配问题
问题描述
项目迁移至新电脑,同时从VS2012升级到VS2019,已将目标框架从.NET v4.0升级至v4.7.2,EntityFramework版本为v6.4.4。
当前状态
机器配置(machine.config)
<DbProviderFactories> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.26.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> <add name="IBM DB2 .NET Data Provider 11.1.3030" invariant="IBM.Data.DB2.11.1.3030" description="IBM DB2 Data Provider 11.1.3030 for .NET Framework 4.0" type="IBM.Data.DB2.DB2Factory, IBM.Data.DB2.11.1.3030, Version=11.1.3030.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208"/> <add name="IBM Informix .NET Data Provider 11.1.3030" invariant="IBM.Data.Informix.11.1.3030" description="IBM Informix Data Provider 11.1.3030 for .NET Framework 4.0" type="IBM.Data.Informix.IfxFactory, IBM.Data.Informix.11.1.3030, Version=11.1.3030.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208"/> </DbProviderFactories>
运行时错误
- 初始异常:
"Unable to find the requested .Net Framework Data Provider. It may not be installed.",来源为EntityFramework - 修改Web.config配置后,出现异常:
"Could not load file or assembly 'IBM.Data.DB2.EntityFramework, Version=11.1.3030.4, ... The located assembly's manifest definition does not match the assembly reference."
排查细节
打印所有提供程序工厂类,结果与machine.config一致,仅存在IBM.Data.DB2.11.1.3030提供程序,但EntityFramework似乎在寻找IBM.Data.DB2提供程序。
修改Web.config的操作:
原配置:
<provider invariantName="IBM.Data.DB2" type="IBM.Data.DB2.EntityFramework.DB2ProviderServices, IBM.Data.DB2.EntityFramework, Version=10.5.5.6, Culture=neutral, PublicKeyToken=..." />
修改后:
<provider invariantName="IBM.Data.DB2.11.1.3030" type="IBM.Data.DB2.EntityFramework.DB2ProviderServices, IBM.Data.DB2.EntityFramework, Version=11.1.3030.4, Culture=neutral, PublicKeyToken=..." />
解决方案
方案1:添加程序集绑定重定向
在Web.config的<runtime>节点下添加绑定重定向,让IBM.Data.DB2的请求指向已安装的11.1.3030.4版本,同时保持EF的provider配置使用invariantName="IBM.Data.DB2":
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 重定向DB2核心程序集 --> <dependentAssembly> <assemblyIdentity name="IBM.Data.DB2" publicKeyToken="7c307b91aa13d208" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-11.1.3030.4" newVersion="11.1.3030.4" /> </dependentAssembly> <!-- 重定向EF相关的DB2程序集 --> <dependentAssembly> <assemblyIdentity name="IBM.Data.DB2.EntityFramework" publicKeyToken="7c307b91aa13d208" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-11.1.3030.4" newVersion="11.1.3030.4" /> </dependentAssembly> </assemblyBinding> </runtime>
同时,确保Web.config中EF的provider配置为:
<provider invariantName="IBM.Data.DB2" type="IBM.Data.DB2.EntityFramework.DB2ProviderServices, IBM.Data.DB2.EntityFramework, Version=11.1.3030.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208" />
方案2:在machine.config中添加IBM.Data.DB2别名
以管理员权限修改machine.config,在<DbProviderFactories>节点下添加一个指向现有11.1.3030版本的IBM.Data.DB2条目:
<add name="IBM DB2 .NET Data Provider" invariant="IBM.Data.DB2" description="IBM DB2 Data Provider for .NET Framework" type="IBM.Data.DB2.DB2Factory, IBM.Data.DB2.11.1.3030, Version=11.1.3030.4, Culture=neutral, PublicKeyToken=7c307b91aa13d208"/>
这样EF寻找IBM.Data.DB2时会直接映射到已安装的版本,无需修改项目配置。
方案3:确认DB2驱动安装完整性
检查是否安装了对应版本的IBM Data Server Client或DB2 .NET Provider,确保IBM.Data.DB2.EntityFramework.dll版本确实为11.1.3030.4且已正确注册到GAC。如果文件版本不匹配,重新安装对应版本的DB2驱动。
内容的提问来源于stack exchange,提问作者wawo
相关产品推荐
相关产品推荐

