最近公司要求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);

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

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

(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?}"); });

(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");
*/ }

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

NetCore2.2升级到3.1总结的更多相关文章

  1. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

    标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...

  2. 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  3. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  4. 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!

    看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...

  5. Entity Framework Core 1.1 升级通告

    原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...

  6. ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录

    升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...

  7. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  8. 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版

    背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...

  9. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part2:clusterware安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 3.安装Clus ...

  10. 升级npm

    查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...

随机推荐

  1. 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制

    #文件管理模块-上传-过滤机制 1.无过滤机制 2.黑名单过滤机制 3.白名单过滤机制 4.文件类型过滤机制 $_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保 ...

  2. 《Vue.js 设计与实现》读书笔记 - 第13章、异步组件与函数式组件

    第13章.异步组件与函数式组件 13.1 异步组件要解决的问题 用户可以简单通过 import 异步导入组件. <template> <component :is="asy ...

  3. manim边学边做--形状匹配

    manim中有几个特殊的用于形状匹配的对象,它们的作用是标记和注释已有的对象,本身一般不单独使用. 形状匹配对象一共有4种: BackgroundRectangle:为已有的对象提供一个矩形的背景 C ...

  4. ftrace irqs跟踪器

    当中断被关闭(俗称关中断)了,CPU就不能响应其他的事件,如果这时有一个鼠标中断,要在下一次开中断时才能响应这个鼠标中断,这段延迟称为中断延迟.向current_tracer 文件写入 irqsoff ...

  5. dotnet定义扩展方法

    // 扩展方法 // 1.创建静态类静态方法 2. 在静态方法中参数中使用 this 关键字指定需要扩展的类 // 密封类 不能直接继承,通过扩展方法,拿到父类的属性和方法进行扩展补充

  6. element的图片上传预处理函数

    /** 图片格式和大小的控制 */ beforeAvatarUpload (file) { // 允许上传 jpg 和 png 格式的图片 const isJPG = file.type === &q ...

  7. Oracle中查看隐含参数的sql

    select a.ksppinm "Parameter", a.ksppdesc "Description", b.ksppstvl "Session ...

  8. 云原生周刊:Microcks 成为 CNCF 沙箱项目

    开源项目推荐 Kubent Kube No Trouble (kubent) 是一个简单的工具,该工具将能够根据您部署资源的方式检测已弃用的 API. kdoctor kdoctor 是一个数据面测试 ...

  9. OpenELB 在 CVTE 的最佳实践

    作者:大飞哥,视源电子股份运维工程师, KubeSphere 社区用户委员会广州站站长,KubeSphere Ambassador. 公司介绍 广州视源电子科技股份有限公司(以下简称视源股份)成立于 ...

  10. My SQL 下载和安装图文解说

    一.下载My SQL 官网下载地址:https://downloads.mysql.com/archives/installer/ 选择需要下载的版本,点击download.本文选择下载的版本是8.0 ...