.NET Core 3.1 作為LTS長期支持版本,會提供3年的支持(明年就出.net5),值得升級(嗎),
目前主流的第三方包大多都已經提供了支持,2.x => 3.1還是變化不是特別多,EF Core坑就大咯,謹慎,
ASP.NET Core 3.1 的新增功能
https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.1?view=aspnetcore-3.1
EF Core 3.0重大改變
https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changes
1,將VS2019更新到16.4.x,會自動安裝3.1的SDK,
2,將專案目標框架升級到3.1,右鍵專案 - 屬性 - 目標框架,或者修改csproj檔案,
<PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> </PropertyGroup>
3,WEB專案中Program.cs檔案,WebHost 改為 Host
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.cs
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();}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/80575.html
標籤:.NET Core
