NetCore2.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  

      

 

2.       Nuget包升级

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

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

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

 

3.      Program类修改

 IWebHostBuilder 修改为IHostBuilder  

 

 代码如下: 

 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      

    

       

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

    

 

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

   

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

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

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

 

  代码如下:

  services.AddControllers(options =>
            {
                options.SuppressAsyncSuffixInActionNames = false;

            }).AddNewtonsoftJson();
View Code

  

    (4)  swagger配置修改:    

      

       

 代码如下:  

 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    

      

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

      

  代码如下:  

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();

 

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

     

        并添加以下配置: 

     

  代码如下: 

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特性

     

     

     

 

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

     

 

8.       枚举DisplayName特征的获取 

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

     

            

      

二、    遇到的问题 

                 具体变更请看3.x的重大变更事项:https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.x/breaking-changes (认认真真仔仔细细看完)

                 以下举例的只是我在项目中遇到的升级3.1之后的问题 ,并不包含所有变更讲解。

        1.                  

     

    异常提示:  

    

 

2.           GroupBy写法问题:

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

        

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

            

             异常提示:

                      

        

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

      

    异常提示:  

   

 

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

    

 

4.            查询中使用了自定义的函数方法,不能转成正常的sql语句

(1)如图一

   

               异常提示:

               

               GetTimestamp方法是自定义的一个API用来处理时间转换成时间戳。

              如左图:在查询使用过程中,直接使用了自定义的方法(GetTimestamp)做时间戳转换,在netcore3.1 直接异常了, 

              GetTimestamp方法不 是sql语句中可以中的函数,因此此条查询写法不能转成一个正确的sql语句了 ,直接异常了。

              如右图:这种转化只能先将数据查询出来放在内存中,然后对内存中的数据再调用GetTimestamp方法做时间转化。 

           

    (2)如图二

           

 

5.         不同数据类型的字段不能进行数学操作

 

 异常信息提示:

 

6.         sql语句like(模糊查询)的语法有所改变

以前我们使用Contains实现模糊查询,升级成core3.1之后Contains生成的sql语句对应LOCATE

 

 

 

 

 升级成core3.1之后,模糊查询like的使用: EF.Functions.Like

 

 

 

posted @ 2021-09-13 16:59  姚小丹  阅读(878)  评论(0编辑  收藏  举报