长久以来,.NET框架一直因为只能在Windows系统上运行而被人黑。所以微软重写了一个跨平台的.NET,这就是.NET Core。现在.NET Core已经更新到2.0了。如果有兴趣的话可以看看官方的更新日志。总之,所有使用.NET Core的同学, 最好都更新到最新版本,在性能、API实现、命令友好度方面都有改进。
相应的,Visual Studio 2017也更新了,详细更新情况请看更新日志,这个有中文版的,很良心。如果希望在新VS中使用.NET Core 2.0,还需要安装单独的.NET Core 2.0 SDK,安装完成之后,VS才会识别到新的.NET Core 2.0 SDK。
微软的ORM框架Entity Framework也得到了更新,这里是官方的更新日志。在Entity Framework Core 2.0中,带来了一些我认为很实用的更新。
现在EF Core 2.0也支持了.NET Standard 2.0。这意味将来我们可以在.NET Framework、Mono、Xamarin、UWP等多种平台上使用一致的API。
举个例子,下面的LINQ会被翻译成对应的LIKE查询语句。
var customers =
from c in context.Customers
where EF.Functions.Like(c.Name, "a%");
select c;
对应的查询语句如下。
SELECT [c].[Id], [c].[Name]
FROM [Customers] AS [c]
WHERE [c].[Name] LIKE N'a%';
这是我认为很实用的一个特性。
var city = "Redmond";
using (var context = CreateContext())
{
context.Customers.FromSql($@"
SELECT *
FROM Customers
WHERE City = {city}");
}
还有一些特性我没介绍,直接看官方更新日志吧。
ASP.NET Core 2.0 的详细更新情况,请看官方博客。
在新版本中引入了一种新的技术 Razor Pages,它在某些更侧重编写页面的场景中有良好的应用。如果项目中启用了MVC的话,那么Razor Pages也自动启用了。
请看官方的例子,下面是一个Razor Pages,它和普通的Razor语法的MVC视图页面很相似,只不过顶部使用@page
指令标识这是一个单独的Razor Pages。
@page
<html>
<body>
<h2>The server-local time now is:</h2>
<p>@DateTime.Now</p>
</body>
</html>
在Razor Pages中也可以添加函数。
@page
@functions {
public string FormatDate(DateTime theTime) {
return theTime.ToString("d");
}
}
<html>
<body>
<h2>The server-local time now is:</h2>
<p>@FormatDate(DateTime.Now)</p>
</body>
</html>
还可以继承和使用PageModel,利用到MVVM模式的优势。详细情况可以参考官方文档,这里不再赘述。
除了Razor Pages,新版本还更新了新的项目模板,DbContext的缓冲池,以及不需要改动代码的Application Insights监测。详情请参考官方文档。
我自己也做了一个ASP.NET Core小程序玩玩,正好借这个机会升级到2.0 ,这里参考了官方的迁移指南。在迁移之前,确保正确安装了.NET Core 2.0 。
首先先升级目标框架,这需要修改csproj
文件。如果原来项目的目标框架是.NET Core ,那么将其升级为netcoreapp2.0
。
<TargetFramework>netcoreapp2.0</TargetFramework>
如果原来项目的目标框架是.NET Framework,那么将其指定为大于等于.NET Framework 4.6.1的版本,例如net461
。
<TargetFramework>net461</TargetFramework>
这里也需要根据项目的目标框架进行修改。这里我原来项目中的依赖包引用是这样的。
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
</ItemGroup>
如果目标框架是.NET Core,那么把这些替换成一个单独的元包即可。
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
</ItemGroup>
如果目标框架是.NET Framework,那么这些依赖包不能修改,但是所有版本都应该修改为2.0.
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.0" PrivateAssets="All" />
</ItemGroup>
将csproj
文件中所有<DotNetCliToolReference />
节点的version
属性更新到2.0.0
,例如下面。
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup>
将PackageTargetFallback
节点和值修改为AssetTargetFallback
节点和属性。
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
下面是修改之后的。
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
主方法可以简化为以下的。
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
之后,如果项目中使用了ASP.NET的权限/认证 API,也需要进行相应的修改。