zoukankan      html  css  js  c++  java
  • .net core2.2升级3.1

    一.NET core升级3.1

    .NET Core 3.1 作为LTS长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗)。

    目前主流的第三方包大多都已经提供了支持,2.x => 3.1还是变化不是特别多,EF Core坑就大咯,谨慎。

    ASP.NET Core 3.1 的新增功能

    https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-3.1?view=aspnetcore-3.1

    EF Core 3.0重大改变

    https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-3.0/breaking-changes

     1,将VS2019更新到16.4.x,会自动安装3.1的SDK。

     2,将项目目标框架升级到3.1,右键项目 - 属性 - 目标框架,或者修改csproj文件。

    <PropertyGroup>
      <TargetFramework>netcoreapp3.1</TargetFramework>
    </PropertyGroup>

    3,WEB项目中Program.cs文件,WebHost 改为 Host

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

    4,WEB项目中Startup.cs

    ConfigureServices 方法中 services.AddMvc() 改为 services.AddControllersWithViews()

    //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddControllersWithViews();

    Configure 方法中 app.UseMvc() 改为 app.UseRouting() 与 app.UseEndpoints()

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();
        app.UseAuthorization();
    
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }

    5,更新所有(相关)nuget包到最新

     6,重新生成解决方案,报错 The project .... must provide a value for Configuration.

    从 Web 项目中移除 Microsoft.AspNetCore... 的 PackageReference,因为已经包含在3.1的目标框架内了

    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />

    大功告成,至少编译通过了,运行中目前只碰到一个坑。

    A tracking query projects owned entity without corresponding owner in result.Owned entities cannot be tracked without their owner. Either include the owner entity in the result or make query non-tracking using AsNoTracking().

    AutoMapper的ProjectTo<>导致,暂时加了个AsNoTracking()解决问题,根据报错信息来看还有另一种解决方案。

    public IEnumerable<UserDto> GetAll()
    {
        return _userRepository.GetAll(tracking: false)
            .OrderByDescending(s => s.Id)
            .ProjectTo<UserDto>(_mapper.ConfigurationProvider)
            .AsEnumerable();
    }

     

    二.ABP框架升级

    注意问题

    1.json序列化反序列 由以前的 Newtonsoft.Json 变更为 .net core3.1 自带的 System.Text.Json

    2.ABP框架2.6 Entity 实体 Id属性更改为 只有get属性 所以添加的时候需要业务自己传入Id

    MapToEntity 对象转化方法自动填充主键Id功能取消 SetIdForGuids 方法删除  

    3.BackgroundJobsDomainModule 变成 AbpBackgroundJobsDomainModule

    4.BackgroundJobsEntityFrameworkCoreModule 变成 AbpBackgroundJobsEntityFrameworkCoreModule

    5.UnitOfWorkOptions 变成 AbpUnitOfWorkOptions

    6.Volo.Abp.Validation 单独成一个模块

    7.AutoMapFrom 移除 使用 Profile    CreateMap<DTO, Entity>(); 方式

    8.异步方法变更

    GetList------------->GetListAsync
    Delete------------->DeleteAsync
    Complete------------->CompleteAsync
    Get------------->GetAsync
    Find------------->FindAsync
    Insert------------->InsertAsync
    Update------------->UpdateAsync

    9.如果程序集界面无法升级 可以直接编辑 csproj 文件

    示例

    <TargetFramework>netcoreapp3.1</TargetFramework>
    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="3.1.3" />
        <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
        <PackageReference Include="Serilog.Sinks.Async" Version="1.4.0" />
        <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
        <PackageReference Include="Swashbuckle.AspNetCore" Version="5.3.1" />
        <PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="2.6.0" />
        <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Bootstrap" Version="2.6.0" />
        <PackageReference Include="Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic" Version="2.6.0" />
        <PackageReference Include="Volo.Abp.Autofac" Version="2.6.0" />
    </ItemGroup>

    其他第三方包统一根据具体情况而定(不一定要升级最新包 需要跟ABP依赖包对比)

    10.程序启动中间件变更

    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseMvcWithDefaultRouteAndArea();
  • 相关阅读:
    【MyLocations】标记位置App开发体会
    iOS开发-Core Location和Map Kit
    iOS开发-轻点、触摸和手势
    iOS开发-GCD和后台处理
    iOS开发-block使用与多线程
    iOS开发-数据持久化
    iOS开发-为程序添加应用设置
    对iOS中MVC的理解
    docker
    linux shell
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/12837532.html
Copyright © 2011-2022 走看看