【问题标题】:Does EF Core 3.1 support DB First approach?EF Core 3.1 是否支持 DB First 方法?
【发布时间】:2020-05-05 17:08:24
【问题描述】:

我们正在将ASP.NET MVC 4.x 应用程序移植到ASP.NET Core 3.1。当前应用程序使用EF 6.x DB first 方法。作为此次迁移的一部分,我们将使用EF Core 3.1 作为当前EF 6.x 的替代品。所以问题是:

EF Core 3.1 是否支持 DB First 方法?

如果没有,有什么选择?我们只剩下代码优先的方法了吗?

感谢您的帮助。

【问题讨论】:

  • “First”(数据库、代码、模型)术语具有误导性。如果您要求 edmx,它不受(也不会)支持。

标签: asp.net-mvc entity-framework asp.net-core entity-framework-core porting


【解决方案1】:

是的。从 .NET Core 1.0 到现在,它都支持 DB First Approach。需要从nugets下载4个

  1. EntityFrameworkCore

  2. EntityFrameworkCore.Design

  3. EntityFrameworkCore.Tools

  4. EntityFrameworkCore.SqlServer

打开工具 > NuGet 包管理器 > 包管理器控制台。并在控制台中输入以下内容。

默认值:

Scaffold-DbContext "Server=yourserveraddress;Database=yourdatabase;user id=youruser;password=yourpassword;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context "YourOwnContext"

看到您关于“Scaffold-DbContext 仅创建 Code First 模型”的评论。不,Scaffold-DbContext 是 Database-First 方法。

“为现有数据库创建实体和上下文类称为数据库优先方法。”

已编辑

如果您在数据库中有新的更新并想要更新 dbcontext,只需在末尾添加 -f。它将更新并覆盖您所有的 dbcontext 和模型类。

Scaffold-DbContext "Server=yourserveraddress;Database=yourdatabase;user id=youruser;password=yourpassword;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context "YourOwnContext" -f

如果要在模型类中添加一些数据注解如[Column]等,可以添加-DataAnnotations

Scaffold-DbContext "Server=yourserveraddress;Database=yourdatabase;user id=youruser;password=yourpassword;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context "YourOwnContext" -DataAnnotations -f

【讨论】:

  • Scaffold-DbContext 中是否有任何 EDMX 文件操作?
  • 没有。它仅基于您现有的数据库创建实体和 Dbcontext 类。 EF Core 不再使用 EDMX。
  • 完美运行。您可以再次运行它来更新模型以反映对数据库的更改吗?还是您需要删除上下文/POCO?
  • 是的,你需要在最后加上-f。它将使用您在数据库中所做的新更改来更新您的模型和上下文。 Scaffold-DbContext "Server=yourserveraddress;Database=yourdatabase;user id=youruser;password=yourpassword;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir 模型 -Context "YourOwnContext" - f
  • 不要像我一样疏忽大意,一旦打开工具 > NuGet 包管理器 > 包管理器控制台,请确保您已从上方工具箱的下拉列表中选择了正确的“默认项目”控制台。
【解决方案2】:

是的,EF Core 首先通过Scaffold-DbContext 命令支持数据库,您也可以使用 EF Core Power Tools。基于 Edmx 的建模不适用于 EF Core,只能使用基于代码的建模。

【讨论】:

  • 似乎Scaffold-DbContext 仅基于现有数据库创建代码优先模型,因此不是真正的数据库优先方法。我不知道它是否操纵任何 EDMX 文件。我错过了什么吗?欲了解更多信息,请参阅docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell
  • 基于 EDMX 的数据库首先只在 EF 6 中可用。如果确实需要,可以在 .NET Core 3.1 上使用 EF 6.3。
  • @DavidBrowne-Microsoft,您介意提供您的评论作为答案吗?
  • 请接受 EricEJ 的回答。如果他愿意,他可以编辑一些关于 EDMX 的内容。
  • @DavidBrowne-Microsoft 我在 .Net Core 3.1 上尝试了 EF 6.3,但没有找到添加 EDMX 的方法。似乎在任何 ASP.NET Core 项目上都无法使用 EDMX,无论是针对 .Net Core 还是 .Net Framework
【解决方案3】:

不,很遗憾,不再有 DB 优先方法。

您可以先从现有数据库中编写代码。使用已经提到的脚手架命令。

我们做什么:

  • 使用脚手架
  • 创建控制脚手架过程的“脚手架脚本”。 (例如将表格拆分为多个上下文)
  • 创建“在脚手架脚本之后”修复脚手架每次犯的所有错误。 (例如损坏的数据类型)
  • 创建更多“后脚手架脚本”,以增强您的模型与所有脚手架不支持。 (例如列 cmets)
  • 尽可能使用部分类以避免每次都丢失更改

但总的来说,没有令人满意的解决方案。 请注意,如果您想要一个完美的 db first 方法,您几乎要重写整个脚手架功能。

【讨论】:

    【解决方案4】:

    Code First/DB First 标题有点误导,但如果您正在寻找基于 EDMX 的解决方案,那么 EF Core 不支持,因为 EF Core 是完全重新设计的 ORM。

    相反,您可以使用数据库脚手架基于现有数据库创建上下文类。

    每当数据库发生变化时,您只需再次运行相同的内容,现有的上下文类及其定义就会被更新后的数据库覆盖。

    听起来是一个漫长的过程,但如果您正在开发具有独立合同层的分层架构,那么它比您想象的要容易得多。

    https://referbruv.com/blog/posts/database-first-generating-models-from-an-existing-database-using-ef-core

    【讨论】:

    • 你只是在重复其他答案。
    • 实际上这是我们使用 EF Core 可以做的最大事情,首先关注的是 afa db。但根据我们设计方法的方式,我们可以更好地处理实体及其变化。
    • 无论如何,重复答案是没有用的。它只会增加噪音。
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多