EF6迁移时加载Microsoft.Identity.Client,Microsoft.Data.SqlClient为何抛TypeInitializationException?
- EF6(Entity Framework 6)代码优先模型类库:多目标
net48;netstandard2.1,采用SDK风格.csproj,启用迁移、禁用自动迁移,用于同时支持.NET Framework和.NET Core项目 - WPF应用程序:.NET Framework 4.8 x64架构,旧式非SDK风格
.csproj,通过项目引用上述类库,已启用自动生成绑定重定向(因依赖限制必须面向.NET 4.8,且需调用x64 C++ DLL) - NuGet依赖情况:
- 类库与WPF项目均安装
Microsoft.EntityFramework.SqlServerv6.5.1,传递依赖Microsoft.Data.SqlClientv5.1.5 Microsoft.Data.SqlClient依赖Microsoft.Identity.Client >=4.56.0和Azure.Identity >=1.10.3
- 类库与WPF项目均安装
- 操作与异常:将
Azure.Identity升级至v1.13.2(同步升级Microsoft.Identity.Client至v4.67.2)后,以WPF为启动项目、类库为默认项目运行Update-Database命令,抛出异常:
System.TypeInitializationException: “Microsoft.Data.SqlClient.SqlAuthenticationProviderManager”的类型初始值设定项引发异常。
System.IO.FileLoadException: 未能加载文件或程序集“Microsoft.Identity.Client, Version=4.56.0.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae”或其某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040)
- 自动绑定重定向的局限性:旧式
.csproj的自动绑定重定向功能,无法完全处理多目标SDK类库与.NET Framework项目之间的跨项目传递依赖版本冲突。Update-Database运行时可能直接加载类库配置,未正确应用WPF项目的绑定重定向规则。 - 强名称程序集的硬版本引用:
Microsoft.Identity.Client是强名称程序集,Microsoft.Data.SqlClientv5.1.5的代码中可能直接引用了v4.56.0.0的精确版本,而非仅遵循NuGet的宽松依赖约束,导致运行时拒绝更高版本的程序集。
方案1:手动添加绑定重定向到WPF项目的App.config
直接在WPF项目的App.config中添加强制绑定规则,将所有旧版本的Microsoft.Identity.Client重定向到已安装的v4.67.2版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.67.2.0" newVersion="4.67.2.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:需确保newVersion与实际安装的Microsoft.Identity.Client精确版本一致。
方案2:升级Microsoft.Data.SqlClient到兼容版本
检查Microsoft.Data.SqlClient的更新版本(如v5.1.6及以上),此类版本通常会更新对Microsoft.Identity.Client的依赖约束,原生支持更高版本,直接升级即可自动解决冲突。
方案3:在类库中锁定依赖版本
在多目标类库的SDK风格.csproj中,显式添加PackageReference锁定版本,确保类库与WPF项目的依赖版本完全统一:
<ItemGroup> <PackageReference Include="Azure.Identity" Version="1.13.2" /> <PackageReference Include="Microsoft.Identity.Client" Version="4.67.2" /> </ItemGroup>
方案4:显式指定启动项目运行Update-Database
在Package Manager Console中,明确指定启动项目和目标类库,确保命令读取WPF项目的绑定重定向配置:
Update-Database -StartupProject "你的WPF项目名称" -Project "你的EF6类库名称"
内容的提问来源于stack exchange,提问作者Hydrargyrum

