.Net Core2.2升级到3.1小记
.net core 3.1 作为lts长期支持版本,会提供3年的支持(明年就出.net5),值得升级(吗)。
目前主流的第三方包大多都已经提供了支持,2.x => 3.1还是变化不是特别多,ef core坑就大咯,谨慎。
asp.net core 3.1 的新增功能
ef core 3.0重大改变
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(); }