.NET跨框架调用报错:无法加载DbProviderFactories类型
解决跨框架DAL引用的DbProviderFactories加载错误
我之前帮同事踩过一模一样的坑,本质就是**.NET Framework 4.5和.NET Core 2.0在数据访问核心组件上的兼容性差异**搞的鬼:.NET Framework里的System.Data.Common.DbProviderFactories属于System.Data程序集,但.NET Core 2.0对这个类型做了重构,当你的.NET Core Web项目调用.NET Framework的DAL时,CLR找不到兼容的类型实现,就会抛出这个错误。
下面是几个逐步递进的解决方案,按推荐程度排序:
方法1:迁移DAL到.NET Standard 2.0(最推荐,一劳永逸)
这是解决跨框架兼容性问题的标准方案,.NET Standard 2.0可以同时兼容.NET Framework 4.5+和.NET Core 2.0,步骤很清晰:
- 新建一个NET Standard 2.0类库项目
- 把原DAL里的所有代码、数据库相关逻辑迁移过来,注意替换NuGet包:比如把.NET Framework专属的
System.Data相关引用换成兼容.NET Standard的包(比如用System.Data.Common,如果用EF的话换成EntityFrameworkCore或者EntityFramework的.NET Standard版本) - 让你的.NET Core 2.0 Web项目引用这个新的.NET Standard DAL项目
方法2:在.NET Core项目里添加兼容配置(临时过渡方案)
如果暂时没法迁移DAL,可以试试在Web项目里做以下配置:
- 编辑Web项目的
.csproj文件,添加绑定重定向配置,帮助CLR匹配兼容的程序集:
<PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
- 安装对应数据库的.NET Core兼容驱动包(比如SQL Server用
Microsoft.Data.SqlClient,MySQL用MySqlConnector),确保版本和DAL里的依赖尽量匹配 - 在
Startup.cs或者Program.cs里显式注册数据库工厂的.NET Core实现,比如SQL Server的例子:
DbProviderFactories.RegisterFactory("System.Data.SqlClient", Microsoft.Data.SqlClient.SqlClientFactory.Instance);
方法3:切换Web项目到.NET Framework(仅限应急,不推荐)
如果上面的方法都走不通,只能临时把.NET Core 2.0 Web项目改成目标框架为.NET Framework 4.5+,但这样就失去了.NET Core跨平台的优势,只能作为短期应急方案。
额外提醒
- 检查DAL里有没有依赖.NET Framework特有的API(比如
System.Configuration.ConfigurationManager的旧配置方式),这些在.NET Core里需要替换成appsettings.json或者其他.NET Core兼容的配置方式 - 尽量避免跨框架直接引用,.NET Standard是微软官方推荐的跨框架组件开发标准,长远来看迁移到.NET Standard会减少很多后续的兼容性坑
内容的提问来源于stack exchange,提问作者user5661230
相关产品推荐
相关产品推荐

