.NET Core 3.1 做为LTS长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗)。web
目前主流的第三方包大多都已经提供了支持,2.x => 3.1仍是变化不是特别多,EF Core坑就大咯,谨慎。app
ASP.NET Core 3.1 的新增功能框架
https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.1?view=aspnetcore-3.1ide
EF Core 3.0重大改变ui
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changesspa
1,将VS2019更新到16.4.x,会自动安装3.1的SDK。.net
2,将项目目标框架升级到3.1,右键项目 - 属性 - 目标框架,或者修改csproj文件。code
<PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup>
3,WEB项目中Program.cs文件,WebHost 改成 Hostblog
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
4,WEB项目中Startup.csget
ConfigureServices 方法中 services.AddMvc() 改成 services.AddControllersWithViews()
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddControllersWithViews();
Configure 方法中 app.UseMvc() 改成 app.UseRouting() 与 app.UseEndpoints()
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseAuthorization(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
5,更新全部(相关)nuget包到最新
6,从新生成解决方案,报错 The project .... must provide a value for Configuration.
从 Web 项目中移除 Microsoft.AspNetCore... 的 PackageReference,由于已经包含在3.1的目标框架内了。
<PackageReference Include="Microsoft.AspNetCore.App" /> <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
大功告成,至少编译经过了,运行中目前只碰到一个坑。
A tracking query projects owned entity without corresponding owner in result.Owned entities cannot be tracked without their owner. Either include the owner entity in the result or make query non-tracking using AsNoTracking().
AutoMapper的ProjectTo<>致使,暂时加了个AsNoTracking()解决问题,根据报错信息来看还有另外一种解决方案。
public IEnumerable<UserDto> GetAll() { return _userRepository.GetAll(tracking: false) .OrderByDescending(s => s.Id) .ProjectTo<UserDto>(_mapper.ConfigurationProvider) .AsEnumerable(); }