生成解决方案时.csproj文件的NuGet包版本自动回退该如何处理
问题成因
- 项目目标框架为
.NET Core 3.1,配套的Microsoft.VisualStudio.Web.CodeGeneration.Design3.x版本存在强依赖限制,必须搭配3.1.x版本的EF Core相关包使用。当你手动将EF Core主包升级为5.0.x后,生成项目时NuGet会自动执行依赖对齐逻辑,将EF Core全家桶版本回退到和脚手架生成工具匹配的3.1.x版本。 - 手动修改csproj时未完成所有EF生态包的版本对齐,EF Core主包、SqlServer驱动、Tools工具包版本不一致时,也会触发NuGet的依赖仲裁机制,自动将所有相关包回退到版本一致的低版本。
- 本地项目的
obj目录下存在旧的引用缓存,生成时优先读取缓存配置,也会导致修改后的版本号被覆盖。
解决方案
方案1:保留.NET Core 3.1框架,统一使用3.1.x版本依赖
如果不需要使用EF Core 5.x的新特性,直接将所有EF相关包版本和脚手架工具对齐即可,修改csproj的包引用节点如下:
<ItemGroup> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.15" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.15" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.15"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.5" /> </ItemGroup>
修改完成后依次执行以下操作:
- 右键解决方案选择「清理解决方案」
- 手动删除项目根目录下的
obj和bin文件夹 - 右键解决方案选择「还原NuGet包」后重新生成,版本回退问题会消失,Razor页面脚手架也可正常使用。
方案2:升级项目框架到.NET 5,使用5.0.x全版本依赖
如果需要使用EF Core 5.x的功能,先升级项目目标框架再同步所有依赖版本:
- 将
PropertyGroup节点中的TargetFramework值修改为net5.0 - 替换所有相关包的版本为匹配的5.0.x版本,修改后的包引用节点如下:
<ItemGroup> <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="5.0.0" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.17" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.17" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.17"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" /> </ItemGroup>
- 执行方案1中的清理、删除缓存、还原包操作后重新生成即可。
内容的提问来源于stack exchange,提问作者Yash Jethani
相关产品推荐
相关产品推荐

