- A+
最近公司要求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);
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(" ")了。
二、 遇到的问题
1.
异常提示:
2. GroupBy写法问题:
(1) GroupBy在分组之后没有使用select指定查询的列,就会报错。因为此写法法生成不了sql语句。
(2) GroupBy在分组之后聚合问题
异常提示:
3. 语句中使用了判断表字段是否是非空使用了IsEmpty
异常提示:
参照以下写法是可以生成sql语句的: