ABP Framework + EF Core 迁移命令失败问题完整解决记录
ABP Framework + EF Core 迁移命令失败问题完整解决记录
问题背景
在将开发环境升级到 Visual Studio 2022 和 .NET SDK 最新版本 后,执行 EF Core 迁移命令时出现错误:
Add-Migration Migration_v3.7.3 -Project YourProject
报错信息显示:
- PowerShell 执行策略阻止运行 NuGet 脚本
- EF Core 和 EF6 同时安装导致冲突
- 无法识别
Add-Migration
命令
项目技术栈:
- ABP Framework 7.2.3
- EF Core 7.0.8
- MySQL 数据库
问题排查与解决过程
1. 初始错误分析
错误现象
- 运行
Add-Migration
时,PowerShell 报错:无法加载文件 C:\Users\...\init.ps1,因为有软件限制策略阻止运行该文件
- 同时提示检测到 EF Core 和 EF6 共存,可能导致工具混淆。
初步尝试
- 调整 PowerShell 执行策略(临时允许脚本运行):
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
- 检查 EF Core 工具是否安装:
输出显示全局工具版本为 9.0.7,而项目使用的是 EF Core 7.0.8,版本不匹配。dotnet ef --version
2. 版本兼容性问题
发现版本冲突
- ABP 7.2.3 依赖 EF Core 7.0.x,但全局
dotnet-ef
工具是 9.0.7,导致命令无法正确执行。 - 项目中混合引用了不同版本的包:
Microsoft.EntityFrameworkCore.Design
(7.0.8)Volo.Abp.EntityFrameworkCore
(7.2.3)
解决方案
- 卸载错误的全局工具:
dotnet tool uninstall --global dotnet-ef
- 安装匹配版本的 EF Core 工具:
dotnet tool install --global dotnet-ef --version 7.0.8
- 验证版本:
dotnet ef --version # 应输出 7.0.8
3. 清理缓存与完整重建
发现问题仍未解决
即使版本匹配后,Add-Migration
仍然报错,怀疑是 缓存污染。
执行完整清理
-
删除
bin
和obj
文件夹(避免旧编译结果干扰):rm -rf bin obj
(或在 Windows 资源管理器手动删除)
-
清理 NuGet 缓存:
dotnet nuget locals all --clear
-
完整重建项目:
dotnet restore dotnet build
最终成功
执行 Add-Migration
或 dotnet ef migrations add
后,迁移命令成功运行。
问题根本原因
- PowerShell 执行策略限制
- 阻止了 NuGet 包的初始化脚本运行。
- EF Core 全局工具版本不匹配
dotnet-ef 9.0.7
无法兼容EF Core 7.0.8
。
- 项目缓存污染
- 旧编译结果或损坏的 NuGet 缓存导致依赖解析错误。
完整解决方案总结
1. 确保版本匹配
- ABP 7.2.3 → EF Core 7.0.x(推荐
7.0.13
) - 全局工具 必须与项目版本一致:
dotnet tool install --global dotnet-ef --version 7.0.13
2. 调整 PowerShell 执行策略
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
3. 清理缓存并重建
rm -rf bin obj
dotnet nuget locals all --clear
dotnet restore
dotnet build
4. 执行迁移
dotnet ef migrations add Migration_v3.7.3 --project YourProject --startup-project Mokk.CTT.Web
或(在 VS 的 Package Manager Console):
Add-Migration Migration_v3.7.3 -Project YourProject
经验总结
- .NET 工具链版本必须严格匹配,特别是
dotnet-ef
和Microsoft.EntityFrameworkCore.*
。 - 缓存问题是 .NET 开发中的“玄学问题”主要来源,遇到奇怪错误时优先清理
bin/obj
和 NuGet 缓存。 - ABP Framework 对 EF Core 版本敏感,建议使用官方推荐的组合(如 ABP 7.2.3 + EF Core 7.0.13)。
后续优化建议
- 升级到 ABP 8.x + EF Core 8.x(长期支持版本,兼容性更好)。
- 使用
dotnet ef
代替Add-Migration
,减少对 Visual Studio 的依赖。 - 在 CI/CD 流程中加入缓存清理步骤,避免构建服务器出现类似问题。
最终结论:
版本匹配 + 清理缓存 是解决 .NET 生态中类似问题的黄金法则! ✅
如果你是公司:参考这个,问题已解决。此问题是由于我公司新的 PowerShell 策略造成的。我的语言模式被设置为“ConstrainLanguage”,而它应该是“FullLanguage”。安全团队帮我重置后,包管理器控制台就能重新识别 EF Core 命令了。
如果你是个人:以上都可参考,哈哈哈哈,希望对你有帮助。
最后的补充手段*很重要
问题:
无法加载文件 C:\Users\xm007.nuget\packages\microsoft.entityframeworkcore.tools\7.0.8\tools\init.ps1,因为
有软件限制策略阻止运行该文件,例如,使用组策略创建的软件限制策略。
最后手段:
控制面板=> Internet 选项 => 内容 => 发布者 => “删除垃圾证书”
我发现,不知何故,微软公司颁发的 3 个证书出现在我的计算机上的不受信任的发布者列表中(Internet 选项 | 内容 | 证书)。
将它们从列表中删除后,包管理器控制台又开始工作了(同时还出现了 Visual Studio 中一些行为异常的情况)。
整个世界都舒坦了,心情美丽!