解决Entity Framework Core 2.0命令行工具与UWP不兼容的问题

如果你在一个面向16299以上版本系统的UWP项目中使用Entity Framework Core 2.0,使用Add-Migration等命令行工具时,命令行工具会直接拒绝运行,出现如下错误信息:

Startup project 'App4' is a Universal Windows Platform app. This version of the Entity Framework Core Package Manager Console Tools doesn't support this type of project. For more information on using the EF Core Tools with UWP projects, see https://go.microsoft.com/fwlink/?linkid=858496

翻译成中文是这个意思:

启动项目“App4”是一个UWP应用。当前版本的Entity Framework Core程序包管理器控制台工具不支持这种类型的项目。要获取有关在UWP项目中使用EF Core Tools的更多信息,请访问https://go.microsoft.com/fwlink/?linkid=858496

最低版本低于16299的UWP项目搭配EF Core 1.1.4使用并不会产生这个问题,但是最低版本为16299的UWP项目即使使用EF Core 1.1.4也会出现同样的错误,因为还原NuGet包的时候依然会自动安装EF Core 2.0.1版本。提示如下:

指定的依赖性是 Microsoft.EntityFrameworkCore.Tools (>= 1.1.4),但最终的依赖性是 Microsoft.EntityFrameworkCore.Tools 2.0.1。

首先不要怀疑UWP与Entity Framework Core 2.0的兼容性。EF Core基于.NET Standard 2.0,与UWP的兼容性是毋庸置疑的。这个问题完全是由于EF Core命令行工具的兼容性导致的。

要解决这个问题,只要避免在UWP项目中运行命令行工具即可。解决方案如下:

  1. 创建一个.NET Standard 2.0项目,在UWP项目中添加该项目的引用。
  2. 创建一个.NET Core 2.0项目,添加上述项目的引用。
  3. 在.NET Standard项目中添加Microsoft.EntityFrameworkCore.Tools和其他的EF Core NuGet包,并把Entity Framework Core相关的类放在这个新项目中。
  4. 当需要使用命令行工具时,将解决方案的启动项目设置成新创建的.NET Core项目,将程序包管理器控制台的“默认项目”设置为新创建的.NET Standard项目,运行需要的命令,则不再会出现错误。

这个方法的原理相当于利用.NET Standard的可移植性,将.NET Core中EF Core命令行工具创建的代码移植到UWP项目中。缺点在于需要将DbContext放到单独的程序集中,而且需要创建一个几乎无用的新项目。

留言

有想法?请给我们留言!您的留言不会直接显示在网站内。