You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.SqlServer v6.5.1,传递依赖Microsoft.Data.SqlClient v5.1.5
    • Microsoft.Data.SqlClient依赖Microsoft.Identity.Client >=4.56.0和Azure.Identity >=1.10.3
  • 操作与异常:将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)

原因分析
  1. 自动绑定重定向的局限性:旧式.csproj的自动绑定重定向功能,无法完全处理多目标SDK类库与.NET Framework项目之间的跨项目传递依赖版本冲突。Update-Database运行时可能直接加载类库配置,未正确应用WPF项目的绑定重定向规则。
  2. 强名称程序集的硬版本引用:Microsoft.Identity.Client是强名称程序集,Microsoft.Data.SqlClient v5.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:12:42