NetCore2.2升级到3.1总结

  • A+
所属分类:.NET技术
摘要

 最近公司要求netcore版本从2.2升级到3.1,升级需要修改的配置项和遇到的问题我这边做一个简单的总结。 

 

最近公司要求netcore版本从2.2升级到3.1,升级需要修改的配置项和遇到的问题我这边做一个简单的总结。 

可参考资料:

https://docs.microsoft.com/zh-cn/aspnet/core/migration/22-to-30?view=aspnetcore-5.0&tabs=visual-studio

https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.x/breaking-changes 

 

netcore3.1 下载:

https://dotnet.microsoft.com/download/dotnet/3.1 

升级之后使用VS2019以及以上版本哦

 

一、   配置项修改 

1.       netcore版本修改为3.1  

      NetCore2.2升级到3.1总结

 

2.       Nuget包升级

         (1)删除包:   Microsoft.AspNetCore.App

    (2)删除包:Microsoft.AspNetCore.Razor.Design

    (3)升级包版本:Swashbuckle.AspNetCore 升级到5.0.0及以上

 

3.      Program类修改

 IWebHostBuilder 修改为IHostBuilder  

 NetCore2.2升级到3.1总结

 代码如下: 

NetCore2.2升级到3.1总结NetCore2.2升级到3.1总结

 Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)                  .ConfigureWebHostDefaults(webBuilder =>                 {                      webBuilder.UseStartup<Startup>()                     .ConfigureLogging((hostingContext, logging) =>                     {                         logging.AddConsole();                     })                     .UseKestrel(op =>                     {                         op.ListenAnyIP(5000,                              listenOptions =>                              {                                  listenOptions.Protocols = HttpProtocols.Http1;                              });                         op.Limits.MaxRequestBodySize = null;                     });                 })             .UseCastleWindsor(HKIocManager.Instance.IocContainer);

View Code

 

4.       Startup类修改: 

  (1)  IHostingEnvironment修改为IWebHostEnvironment      

NetCore2.2升级到3.1总结    NetCore2.2升级到3.1总结

       

    (2)  ConfigureServices方法返回结果由IServiceProvider修改为void 

    NetCore2.2升级到3.1总结

 

     (3)  services.AddMvc()修改为  services.AddControllers().AddNewtonsoftJson()  

    NetCore2.2升级到3.1总结

    注意:方法名结尾的async会自动取消。

   比如:定义的方法名为SearchMemberAsync(),但是在请求方法SearchMemberAsync时提示没有此方法 ,请求SearchMember方法时却请求成功 

   为了方法名结尾不取消async,配置SuppressAsyncSuffixInActionNames参数为false

 

  代码如下:

NetCore2.2升级到3.1总结NetCore2.2升级到3.1总结

  services.AddControllers(options =>             {                 options.SuppressAsyncSuffixInActionNames = false;              }).AddNewtonsoftJson();

View Code

  

    (4)  swagger配置修改:    

     NetCore2.2升级到3.1总结 

     NetCore2.2升级到3.1总结  

 代码如下:  

NetCore2.2升级到3.1总结NetCore2.2升级到3.1总结

 services.AddSwaggerGen(options =>             {                 options.CustomSchemaIds(z => z.FullName);                 options.SwaggerDoc("v1", new OpenApiInfo { Title = "自定义 API", Version = "v1" });                 options.DocInclusionPredicate((s, b) => true);                 options.IncludeXmlComments(Path.Combine(_environment.ContentRootPath, "XMLDocument", "自定义.xml"));                 options.IncludeXmlComments(Path.Combine(_environment.ContentRootPath, "XMLDocument", "自定义.xml"));                  options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()                 {                     Description = "JWT 授权. Example: "Authorization: Bearer {token}"",                     Name = "Authorization",                     In = ParameterLocation.Header,                     Type = SecuritySchemeType.ApiKey,                     Scheme = "bearer",                     BearerFormat = "JWT"                  });                  options.AddSecurityRequirement(new OpenApiSecurityRequirement                 {                     {                           new OpenApiSecurityScheme                           {                                 Reference = new OpenApiReference                                 {                                    Id = "Bearer",                                    Type = ReferenceType.SecurityScheme                                 }                           },                            Array.Empty<string>()                     }                  });              });

View Code

  

(5) return services.AddDynamicEF 删除return    

NetCore2.2升级到3.1总结

      

     (6) app.UseMvc修改为app.UseEndpoints 

NetCore2.2升级到3.1总结

      

  代码如下:  

NetCore2.2升级到3.1总结NetCore2.2升级到3.1总结

app.UseEndpoints(endpoints =>             {                 endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");                 endpoints.MapControllerRoute("defaultWithArea", "{area}/{controller=Home}/{action=Index}/{id?}");              });

View Code

 

(7)  删除app.UseDeveloperExceptionPage();

  添加app.UseRouting();

NetCore2.2升级到3.1总结

 

 5.       视图:由以前的DbQuery修改为 DbSet     

     NetCore2.2升级到3.1总结

        并添加以下配置: 

NetCore2.2升级到3.1总结

     

  代码如下: 

NetCore2.2升级到3.1总结NetCore2.2升级到3.1总结

private void SetDbView(ModelBuilder modelBuilder)         {                modelBuilder.Entity<视图对应的实体名称>().ToView("数据库中视图名称");              /*              举例:               modelBuilder.Entity<VwFilterSku>().HasNoKey().ToView("vw_filter_sku");              modelBuilder.Entity<VwQuerySku>().HasNoKey().ToView("vw_query_sku");              */          }

View Code

 

6.       Map映射问题

        使用映射必须在数据源或者映射源上面标记AutoMap特性

     NetCore2.2升级到3.1总结

     NetCore2.2升级到3.1总结

    NetCore2.2升级到3.1总结 

 

7.        表名列名转换写法变化   

     NetCore2.2升级到3.1总结

 

8.       枚举DisplayName特征的获取 

   由[DisplayName(" ")]特征 修改为[Display(Name=" ")] ,不支持DisplayName(" ")了。

     NetCore2.2升级到3.1总结

     NetCore2.2升级到3.1总结       

     NetCore2.2升级到3.1总结 

二、    遇到的问题 

        1.                  

     NetCore2.2升级到3.1总结

    异常提示:  

    NetCore2.2升级到3.1总结

 

2.           GroupBy写法问题:

       (1)   GroupBy在分组之后没有使用select指定查询的列,就会报错。因为此写法法生成不了sql语句。     

        NetCore2.2升级到3.1总结

              (2)    GroupBy在分组之后聚合问题                    

            NetCore2.2升级到3.1总结

             异常提示:

            NetCore2.2升级到3.1总结         

        

3.           语句中使用了判断表字段是否是非空使用了IsEmpty        

    NetCore2.2升级到3.1总结 

    异常提示:  

   NetCore2.2升级到3.1总结

 

 参照以下写法是可以生成sql语句的:  

     NetCore2.2升级到3.1总结