• 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)如图二

               

  • 相关阅读:
    POJ3070 Fibonacci[矩阵乘法]【学习笔记】
    NOIP模拟赛20161023
    洛谷P2964 [USACO09NOV]硬币的游戏A Coin Game
    Jmeter之Bean shell使用
    jmeter 之 BeanShell PostProcessor跨线程全局变量使用
    详解JMeter函数和变量
    性能测试指标(图表)
    http协议基础(十一)http与https
    http协议进阶(六)代理
    http协议进阶(五)连接管理
  • 原文地址:https://www.cnblogs.com/yaoxiaodan/p/15263204.html
Copyright © 2020-2023  润新知