.NET Standard下System.Data.SqlClient加载错误求助(EF Core+Service Fabric场景)
解决EF Core中System.Data.SqlClient程序集版本不匹配问题(Service Fabric + .NET Standard场景)
当然可以通过程序集绑定重定向(也就是你说的程序集映射)搞定这个版本不匹配的坑!这种情况在Service Fabric里用.NET Standard类库太常见了——毕竟不同依赖包对System.Data.SqlClient的版本要求经常打架。下面给你分步讲怎么操作:
核心思路
因为.NET Standard类库本身没法单独加载配置,所以绑定重定向的配置要放在承载这个类库的Service Fabric服务项目里(不是你的.NET Standard类库项目),让宿主进程加载时统一处理版本映射。
针对.NET Framework宿主的Service Fabric服务
如果你的Service Fabric服务是基于.NET Framework的(比如传统的无状态/有状态服务),按以下步骤来:
- 打开服务项目里的
app.config文件 - 在
<configuration>节点内添加<runtime>配置块,把报错的版本映射到你实际安装的版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Data.SqlClient" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <!-- oldVersion覆盖从最低到报错的版本范围,newVersion填你项目里实际装的版本 --> <bindingRedirect oldVersion="0.0.0.0-4.6.0.0" newVersion="4.8.5.0" /> </dependentAssembly> </assemblyBinding> </runtime>
- 注意把
newVersion改成你项目中System.Data.SqlClient包的实际版本(比如你装的是4.8.3就填4.8.3.0) oldVersion的范围要包含报错里的4.2.0.0,这样所有旧版本请求都会被重定向到指定的新版本
针对.NET Core/.NET 5+宿主的Service Fabric服务
如果是基于.NET Core的Service Fabric服务(比如ASP.NET Core无状态服务),没有app.config,可以用两种方式:
方式1:通过项目文件配置
打开服务项目的.csproj文件,添加以下配置:
<ItemGroup> <!-- 自动处理System.Data.SqlClient的绑定重定向 --> <RuntimeHostConfigurationOption Include="System.Data.SqlClient.BindingRedirects" Value="true" /> </ItemGroup>
方式2:手动创建runtimeconfig.json
在服务项目根目录创建[你的服务项目名].runtimeconfig.json文件,添加版本映射:
{ "runtimeOptions": { "assemblyBinding": { "dependencies": { "System.Data.SqlClient": { "assemblyVersion": "4.8.5.0", "publicKeyToken": "b03f5f7f11d50a3a" } } } } }
额外注意事项
- 确认你的.NET Standard类库已经正确安装了
System.Data.SqlClient包,且版本和绑定重定向里指定的完全一致 - 部署前检查Service Fabric服务包:右键服务项目 -> 「查看包内容」,确认配置文件(app.config/runtimeconfig.json)已经被包含在包内
- 如果还是报错,试试清理解决方案、删除bin/obj文件夹后重新生成,避免旧程序集缓存搞事情
- 可选方案:如果你的EF Core版本比较新,可以考虑迁移到
Microsoft.Data.SqlClient(EF Core 3.0+推荐使用),从根源上避免System.Data.SqlClient的版本冲突问题
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

