NET6项目Azure DevOps执行EF迁移报缺失.NET Core 3.1.0怎么办
根因
该问题和项目本身的目标框架、EF Core依赖版本无关,核心是dotnet CLI的工具加载优先级逻辑,加上构建代理的全局工具环境污染:
- dotnet CLI执行
dotnet ef命令时,会优先检索全局工具路径下注册的dotnet-ef版本,其次才会查找当前目录下通过dotnet-tools.json配置的本地工具 - 出现报错的构建代理上,全局预装了3.1.0版本的dotnet-ef。该版本工具本身基于.NET Core 3.1编译,启动时需要依赖3.1版本的.NET Core运行时,和你项目使用的.NET 6、EF Core 6.0没有任何关联,因此才会出现「工具版本低于运行时版本」的提示,以及找不到3.1.0框架的报错
- 你配置的6.0.6版本dotnet-ef属于本地工具,因为全局旧版本的优先级更高,实际执行迁移命令时根本没有被加载。
解决方案
以下任意一种方案都可以解决问题,优先推荐前两种,适配所有代理环境:
- 显式调用本地版本的dotnet-ef
执行迁移操作前先运行dotnet tool restore确保本地工具安装完成,后续所有EF相关命令不要用dotnet ef简写,改用dotnet tool run dotnet-ef前缀调用,例如生成迁移脚本的命令写为dotnet tool run dotnet-ef migrations script -o migration.sql。这种写法会强制加载dotnet-tools.json中指定的6.0.6版本,完全跳过全局旧工具。 - 构建前置步骤卸载全局旧版dotnet-ef
在执行任何EF相关命令前,增加一行命令删除全局安装的旧版本工具:dotnet tool uninstall -g dotnet-ef。卸载完成后再执行dotnet tool restore恢复本地工具,后续直接使用dotnet ef命令就会自动加载本地6.0版本,不会再触发旧版本依赖问题。 - 替换无环境污染的构建代理
如果使用自托管代理,直接清理全局工具目录下的旧dotnet-ef即可;如果使用微软托管代理,指定使用windows-2022、ubuntu-22.04这类默认未预装.NET Core 3.1全局EF工具的代理池版本,从环境层面规避旧工具干扰。
操作前可以先执行dotnet ef --version验证当前加载的工具版本,确认输出为6.0.x后再执行后续迁移操作,避免无效运行。
内容的提问来源于stack exchange,提问作者user3888578
相关产品推荐
相关产品推荐

