一.NET core升级3.1
.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(); }
二.ABP框架升级
注意问题
1.json序列化反序列 由以前的 Newtonsoft.Json 变更为 .net core3.1 自带的 System.Text.Json
2.ABP框架2.6 Entity 实体 Id属性更改为 只有get属性 所以添加的时候需要业务自己传入Id
MapToEntity 对象转化方法自动填充主键Id功能取消 SetIdForGuids 方法删除
3.BackgroundJobsDomainModule 变成 AbpBackgroundJobsDomainModule
4.BackgroundJobsEntityFrameworkCoreModule 变成 AbpBackgroundJobsEntityFrameworkCoreModule
5.UnitOfWorkOptions 变成 AbpUnitOfWorkOptions
6.Volo.Abp.Validation 单独成一个模块
7.AutoMapFrom 移除 使用 Profile CreateMap<DTO, Entity>(); 方式
8.异步方法变更
GetList------------->GetListAsync
Delete------------->DeleteAsync
Complete------------->CompleteAsync
Get------------->GetAsync
Find------------->FindAsync
Insert------------->InsertAsync
Update------------->UpdateAsync
9.如果程序集界面无法升级 可以直接编辑 csproj 文件
示例
<TargetFramework>netcoreapp3.1</TargetFramework> <ItemGroup> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.3" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.1" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.6.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Bootstrap" Version="2.6.0" /> <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="2.6.0" /> <PackageReference Include="Volo.Abp.Autofac" Version="2.6.0" /> </ItemGroup>
其他第三方包统一根据具体情况而定(不一定要升级最新包 需要跟ABP依赖包对比)
10.程序启动中间件变更
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseMvcWithDefaultRouteAndArea();