ASP.NET Core 3.1 Web API切换EF Core至Sqlite时迁移触发TypeLoadException
嘿,这个问题我之前也踩过坑,本质就是EF Core版本不兼容搞出来的麻烦,我来帮你捋清楚问题出在哪以及怎么解决:
问题根源
你用的是ASP.NET Core 3.1,这个版本对应的EF Core必须是3.1.x系列,但错误日志里明确提到了Microsoft.EntityFrameworkCore, Version=5.0.0.0——这说明你的项目里同时混了EF Core 3.1和5.0的包!
SemanticVersionComparer这个类型是EF Core 5.0才新增的,3.1版本里根本没有这个类,当迁移工具试图调用这个不存在的类型时,自然就抛出了类型加载失败的错误。大概率是你安装Sqlite包的时候,不小心装了5.0版本的,和原本的3.1 EF Core冲突了。
解决步骤
1. 检查并统一EF Core包版本
打开你的项目文件(.csproj),找到所有Microsoft.EntityFrameworkCore.*开头的包引用,比如Microsoft.EntityFrameworkCore.Sqlite、Microsoft.EntityFrameworkCore.Tools这些,确保它们的版本全部是3.1.x(和你的ASP.NET Core版本严格对应),绝对不能有5.0的版本。
举个正确的包引用例子:
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.32" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.32"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference>
2. 清理冲突的包并重新安装
如果发现有5.0版本的包,先卸载它们:
Uninstall-Package Microsoft.EntityFrameworkCore -Version 5.0.0 Uninstall-Package Microsoft.EntityFrameworkCore.Sqlite -Version 5.0.0
然后重新安装对应3.1版本的包:
Install-Package Microsoft.EntityFrameworkCore.Sqlite -Version 3.1.32 Install-Package Microsoft.EntityFrameworkCore.Tools -Version 3.1.32
或者直接修改.csproj文件后,右键项目选择「还原NuGet包」也可以。
3. 重新执行迁移命令
清理完依赖后,重启你的命令行窗口或者Visual Studio(避免缓存干扰),然后重新执行迁移命令:
add-migration initial -context ApplicationContext
额外提醒
ASP.NET Core和EF Core的版本是强绑定的,3.1的项目必须用3.1版本的EF Core,5.0的项目对应5.0,跨版本混用很容易出现这类奇怪的兼容性问题,以后安装包的时候一定要注意版本匹配哦!
内容的提问来源于stack exchange,提问作者Steve

