【问题标题】:.NET Framework MVC project referencing a .NET Standard 2.0 project that generates a EF Core dbcontext. Why doesnt it work?.NET Framework MVC 项目引用生成 EF Core dbcontext 的 .NET Standard 2.0 项目。为什么它不起作用?
【发布时间】:2019-09-04 19:56:01
【问题描述】:

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

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

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

您的启动项目“Sr.RazorFrame”未引用 Microsoft.EntityFrameworkCore.Design。此包是 Entity Framework Core Tools 工作所必需的。确保您的启动项目正确,安装包,然后重试。

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

【问题讨论】:

  • 我认为您不能在 .net 框架项目中引用核心 dll。您需要该 dll 的两个版本,一个用于核心,一个用于 .net 框架。
  • 那么有 .net 2.0 标准版吗?或者我想这没有意义......也许简单的方法是使用核心项目创建架构和种子,然后切换到 .NET Framework 项目来使用它?
  • 仅仅因为一个包的名字中有 Core 并不一定意味着它以 .NET Core 为目标,甚至支持 .NET Core。
  • 我认为您不能在 .net 框架应用程序中引用核心程序集,反之亦然。这可能是可能的,但你会有限制。您可能会在参考旁边看到黄色三角形。创建一个新的控制台应用程序,您会看到有两个选项,控制台应用程序(.Net Core)和控制台应用程序(.Net Framework)。

标签: c# asp.net-mvc entity-framework asp.net-core .net-standard-2.0


【解决方案1】:

但我不能这样做,因为它是 .NET Framework。

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

那么是否有适用于 STANDARD 的 Microsoft.EntityFrameworkCore.Design?

如果你查看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>

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

  1. 添加额外的目标框架名称,例如netcoreapp2.1。见Tseng's answer
  2. 不要忘记添加对Microsoft.EntityFrameworkCore.Design 的引用。如果您还没有安装 ef-core 工具,请同时安装 Microsoft.EntityFrameworkCore.Tools
  3. 添加具有无参数构造函数的 DbContext,或创建 DesignTime Factory。更多详情请见official docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多