.NET Framework MVC 项目引用生成 EF Core dbcontext 的 .NET Standard 2.0 项目。为什么它不起作用?

.NET Framework MVC project referencing a .NET Standard 2.0 project that generates a EF Core dbcontext. Why doesnt it work?

我有一个项目使用 CORE RAZOR PAGES Web 项目和两个 .net 标准 2.0 class 库完成。一个是基础设施 class 而不是我的 DbContext。

所以我被告知我需要使用 .NET Framework Classic 作为 Web 界面而不是核心。由于 .NET Framework 4.7.2 和 .NET core 2.2 对 .NET 标准 2.0 有效,我想我可以有一个新的 Web 项目,但保留两个 class 库。

所以我引用了两个 class 库并使用控制台 运行 'update-database'。启动项目是 .NET Framework MVC 项目,'Default Project' 是 .NET 标准 2.0 class 库。但是我得到错误

您的启动项目 'Sr.RazorFrame' 没有引用 Microsoft.EntityFrameworkCore.Design。 Entity Framework 核心工具需要此包才能工作。确保您的启动项目正确,安装包,然后重试。

所以它说我的项目需要一个 CORE Nuget 包,但我不能这样做,因为它是 .NET Framework...我很困惑...所以有 Microsoft.EntityFrameworkCore.Design 用于 STANDARD 吗?

but I can't do that since it is .NET Framework.

实际上,您可以在 .NET Framework 项目中使用 Microsoft.EntityFrameworkCore.Design

So Is there a Microsoft.EntityFrameworkCore.Design for STANDARD ?

如果您查看 Microsoft.EntityFrameworkCore.Design 包 (v2.2.6),您会发现有一个 net461 版本和一个 netstandard2.0:

├───build
│   ├───net461
│   └───netcoreapp2.0
├───lib
│   ├───net461
│   └───netstandard2.0
├───package
│   └───services
│       └───metadata
│           └───core-properties
└───_rels

所以在经典的 ASP.NET MVC WebApp 中使用它会很好。

对于 .NET Framework 项目中的 运行 ef-core 工具,请确保您已添加以下包:

  1. Microsoft.EntityFrameworkCore.Design
  2. Microsoft.EntityFrameworkCore.Tools 个包。

如果您正在使用 SqlServer,请随意安装 Microsoft.EntityFrameworkCore.SqlServer 包。

最后,您可以在 .NET Framework 项目中 运行 Add-MigrationUpdate-Database

PM> Add-Migration InitialCreate -Project Your.Standard.Lib.That.Contains.DbContext
To undo this action, use Remove-Migration.
PM> Update-Database -Project Your.Standard.Lib.That.Contains.DbContext
Applying migration '20190905015739_InitialCreate'.
Done.
PM>

虽然这种方法有效,但我怀疑它是否值得。因为您甚至可以 运行 ef-core 在纯 .NET Standard2.0 库中进行迁移:

  1. 添加一个额外的目标框架名称,例如netcoreapp2.1。参见
  2. 不要忘记添加对 Microsoft.EntityFrameworkCore.Design 的引用。如果您还没有安装 ef-core 工具,请同时安装 Microsoft.EntityFrameworkCore.Tools
  3. 添加具有无参数构造函数的 DbContext,或创建 DesignTime 工厂。有关详细信息,请参阅 official docs