NetCore2.2升级到3.1总结
最近公司要求netcore版本从2.2升级到3.1,升级需要修改的配置项和遇到的问题我这边做一个简单的总结。
可参考资料:
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总结的更多相关文章
- 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级
标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...
- 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...
- 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. ...
- 看完SQL Server 2014 Q/A答疑集锦:想不升级都难!
看完SQL Server 2014 Q/A答疑集锦:想不升级都难! 转载自:http://mp.weixin.qq.com/s/5rZCgnMKmJqeC7hbe4CZ_g 本期嘉宾为微软技术中心技术 ...
- Entity Framework Core 1.1 升级通告
原文地址:https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-entity-framework-core-1-1/ 翻译:杨晓东 ...
- 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 ...
- SQL Server2016升级前几点自检
SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...
- 如何安全的将VMware vCenter Server使用的SQL Server Express数据库平滑升级到完整版
背景: 由于建设初期使用的vSphere vCenter for Windows版,其中安装自动化过程中会使用SQL Server Express的免费版数据库进行基础环境构建.而此时随着业务量的增加 ...
- 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 ...
- 升级npm
查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...
随机推荐
- JVM 系列知识体系全面回顾
经过几个月的努力,JVM 知识体系终于梳理完成了. 很早之前也和小伙伴们分享过 JVM 相关的技术知识,再次感谢大家支持和反馈. 最后再次献上 JVM系列文章合集索引,感兴趣的小伙伴可以点击查看. J ...
- Blazor 子组件与父组件通过 ChildEvents 传递数据的方法
想要实现 Blazor 子组件向父组件传递数据, 参考 痴者工良的博文所描述的方式, .Net 5.0 下编译未能通过, 于是先修改一下, 简化为光触发事件通知而不传值 子组件 Child.razor ...
- Kulla-Conty BRDF
question: brdf中的几何因子考虑了微表面的自遮挡,当表面粗糙度较大或者与法线夹角越大时,这个因子越小,导致颜色越暗.这部分能量相等于直接忽略掉了,实际上被遮挡的光线会被反射,然后经过若干次 ...
- dotnet Core 静态方法和构造方法
// 静态方法: // 特点:1.生命周期一旦创建-应用结束 才会结束 2.全局的 3.效率高(放在内存中) // 用户:用户登录,系统配置信息,系统设置,SQLHelper // 注意:静态的东西创 ...
- 点亮PC13- 使用寄存器点亮
#include "stm32f10x.h" // Device header int main(void) { // 打卡GPIOC的时钟 RCC->APB2ENR = 0 ...
- 在 OpenFunction 中运行 Serverless 应用
除了构建和运行 Serverless 函数之外,OpenFuntion 还支持构建和运行 Serverless 应用.因此,OpenFunction 用户可以不用局限在各语言的 functions-f ...
- python-mongodb简单封装
#!/usr/bin/python # -*- coding: UTF-8 -*- '''@auther :mr.qin @IDE:pycharm''' import pymongo from too ...
- house of stom
完成事项 house of stom学习 未完成事项 wmctf的blineless没打通 如何解决未完成事项 下周待做事项 house of orange house of lore 本周学习的知识 ...
- 【转载】 TensorFlow中CNN的两种padding方式“SAME”和“VALID”
原文地址: http://blog.csdn.net/wuzqchom/article/details/74785643 --------------------------------------- ...
- Linux 练习
目录 练习一 练习2 练习一 分析日志t.log(访问量),将各个ip地址截取,并统计出现次数,并按从大到小排序(腾讯) 每行格式:http: //192.168.200.30/index1.html ...