【问题标题】:What app.UseMigrationsEndPoint does in .NET Core Web Application Startup classapp.UseMigrationsEndPoint 在 .NET Core Web 应用程序启动类中的作用
【发布时间】:2021-03-31 00:13:54
【问题描述】:

我从 Visual Studio 创建了一个新的 .NET Core Web 应用程序,并在启动类中生成了这段代码:

if (env.IsDevelopment())
{
    // ***
    app.UseMigrationsEndPoint();
    // ***
}

这条线app.UseMigrationsEndPoint()实际上是做什么的? The official docs 一点帮助都没有:

处理执行迁移操作的请求。中间件将监听对 DefaultPath 的请求。

默认路径是什么?向它发布什么?它实际上会执行什么?它有任何可选参数吗?它是否受到某种保护?

【问题讨论】:

  • 什么不清楚?文档引用静态 MigrationsEndPointOptions.DefaultPath 字段,该字段是同一类上 Path 属性的默认值。在该属性中输入应允许您查看 source 中的值或一瞥
  • 你是对的,一切都可以在源代码中找到。我想我已经习惯了 MS 文档涵盖所有内容的 MSDN 时代。 RTFM 变成了 RTFS :)

标签: c# asp.net-core entity-framework-core asp.net-core-5.0


【解决方案1】:

您可能已经从链接的文档页面中看到,它来自 EF Core。将要运行的确切代码可以在 GitHub 上找到。

它会检查使用的数据库是否有任何待处理的迁移,并在需要时应用它们。就是这样。

【讨论】:

  • 感谢您的澄清。我仍然对 ASP.NET 网站如何在没有完全应用 db-migrations 的情况下启动和运行感到奇怪。我的意思是,不应该在网站启动之前运行 db-migrations 吗?当网站启动并运行时,如何将新的 db-migration 引入运行时。即使有可能,那不是很危险吗?我想我一定错过了一个场景。
  • 为了支持上述场景,此代码存在。这意味着您将新版本部署到生产槽,这会导致应用程序重新启动。在此重新启动时,将应用迁移,之后新代码开始运行。缩短停机时间。
  • 此外,只要架构更改只是附加的并且不包含任何新的键约束(例如,您向表中添加一个简单的列),EF 就可以使用 旧设计 i> 并且根本看不到或使用此列,这意味着如果您的代码添加了新实体,它们必须支持 nullity,或者 SQL 模式必须在过渡阶段提供有意义的默认值。
【解决方案2】:

这个app.UseMigrationsEndPoint()实际上是一个非常方便的开发工具。

随着我们的开发,我们将实体添加到数据库上下文中,或者修改我们拥有的实体。我们像往常一样运行dotnet ef migrations add <NameOfMigration>,这将生成迁移文件。当migrations add 命令成功时,我个人通常会运行dotnet ef database update。但是,有了app.UseMigrationsEndPoint(),我就不必手动运行dotnet ef database update

因此,我们尝试在开发中构建和运行我们的应用程序。浏览器加载了我们的应用程序,但 database update 还没有像我们预期的那样发生。

但是,如果我们尝试访问需要访问尚未更新的表的页面或 API 调用,我们会得到一个特殊页面 - 不是错误页面 - 而是列出所有尚未更新的迁移的页面'尚未应用。

令人惊讶的是,有一个标记为“应用迁移”(或类似名称)的按钮。我们将单击它,然后我们的数据库将根据尚未应用的迁移进行更新。然后我们将重新加载页面,然后浏览器将按照我们的预期显示页面。我们可以查看SQL Server Object Explorer 或其他工具中的表格,我们将看到这些迁移反映。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多