ASP.NET Core Web API未找到已注册System.Data.SqlClient数据提供程序报错
问题原因
该报错是EF6在.NET Core 2.2环境下适配时,SqlClient数据提供程序未正确注册、版本依赖冲突共同导致的,现有操作存在注册时机错误、配置格式不兼容的问题,可按以下步骤修复:
修复步骤
第一步:安装匹配版本的NuGet依赖包
卸载所有不兼容的包后,安装以下两个稳定版包:EntityFramework.SqlServer:版本必须和你使用的EF6 6.0.0完全对齐System.Data.SqlClient:选择4.6.1版本,适配.NET Core 2.2运行环境
同时卸载不需要的Microsoft.EntityFrameworkCore.Tools3.1.20包:你使用的是EF6而非EF Core,该包不仅无效还会触发版本冲突。
第二步:调整SqlClient工厂注册位置
之前将注册代码放在Startup的Configure方法中时机过晚,EF初始化时工厂还未完成注册,需要将注册逻辑移到Program.cs的Main方法最开头:public static void Main(string[] args) { // 优先注册SqlClient数据提供程序工厂 DbProviderFactories.RegisterFactory("System.Data.SqlClient", System.Data.SqlClient.SqlClientFactory.Instance); CreateWebHostBuilder(args).Build().Run(); }第三步:删除无效配置
删掉你在appsettings.json中添加的entityFramework节点配置,该配置是.NET Framework下web.config的配置规则,EF6在.NET Core环境下不会读取该配置,多余配置反而可能干扰运行。第四步:强制加载EF6 SqlServer提供程序(可选,仅前面步骤执行后仍报错时添加)
在自定义DbContext的静态构造函数中添加逻辑,强制加载SqlServer提供程序避免编译时被优化移除:public class YourCustomDbContext : DbContext { static YourCustomDbContext() { // 强制引用SqlProviderServices,避免程序集被裁剪 var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance; } public YourCustomDbContext(string connectionString) : base(connectionString) { } // 其余DbSet定义保持不变 }第五步:清理缓存重启项目
执行完上述操作后,删除项目根目录下的bin、obj文件夹,再重新编译运行即可。
内容的提问来源于stack exchange,提问作者Hanieh Kiaee
相关产品推荐
相关产品推荐

