【问题标题】:Why does application start with dotnet ef migrations add?为什么应用程序以 dotnet ef migrations add 开头?
【发布时间】:2022-08-22 17:49:04
【问题描述】:

我在 VS2019 的开发人员 PowerShell 中使用 EF Core 工具有奇怪的行为。

使用此命令创建迁移后:

dotnet ef migrations add VisibleLink -p .\\src\\Only.Portal.Data\\ -s .\\src\\Only.Portal.Web

它导致启动我的应用程序,但以前没有。应用最后一次迁移的方法,导致dotnet ef migrations remove完全崩溃,因为使用它时,它首先启动一个应用程序,然后调用`Migrate()。

然后我收到一条消息:

迁移 \'20220128090939_VisibleLink\' 已应用于数据库。还原它并重试。如果迁移已应用于其他数据库,请考虑使用新迁移来恢复其更改

看起来像死循环。

  • 真正的问题是“启动应用程序”还是“已应用迁移”?
  • 真正的问题是它正在启动应用程序并在应用程序内部调用 Migrate() 方法,导致 dotnet ef 迁移删除推送错误,说明迁移已应用。
  • 当您说“启动应用程序”时,您的意思是应用程序 ui/进程已启动吗?
  • 只有 API。 -> 托管环境:开发内容根路径:C:\\Users\\hoozr\\source\\repos\\portal-web\\src\\Only.Portal.Web 现在监听:localhost:5000 现在监听: localhost:5001 应用程序已启动。按 Ctrl+C 关闭。

标签: c# entity-framework-core entity-framework-migrations ef-core-6.0


【解决方案1】:

我对作者自己的回答不满意标记为已接受的解决方案.我非常不清楚这里的实际“解决方案”是什么。只提到应该“使用启动”。没有提及实际解决问题的确切内容。

我正在运行一个具有最少启动 API 的 .NET 6 ASP.NET 应用程序,并遇到了同样的问题。 dotnet ef migrations 会调用我的启动代码,导致整个应用程序尝试启动并失败(特别是我有一个在启动时直接运行的服务,它试图使用我正在积极尝试创建迁移的数据库表为了)。

我通过远离最小 API 并使用“假”public static IHostBuilder CreateHostBuilder 方法创建一个 Program 类来解决它。

public class Program
{
    // Have a Main that actually runs/starts your app with all the logic
    public static async Task Main(string[] args)
    {
        // Here I do automatic migrations...
        // ...

        // Web app initialization logic
        var builder = WebApplication.CreateBuilder(args);
        builder.Services.AddRazorPages();

        var app = builder.Build();

        app.UseAuthentication();
        app.UseAuthorization();
        app
            .MapControllers()
            .RequireAuthorization();
        // etc.

        await app.RunAsync();
    }
    
    // Have a CreateHostBuilder that simply returns a default builder.
    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        Console.WriteLine("Doing Entity Framework migrations stuff, not starting full application");
        return Host.CreateDefaultBuilder();
    }
}

EF 将在Program 中寻找CreateHostBuilder 方法。如果找到它,它将不会调用Main,并且基本上会跳过您的 web 应用程序的整个初始化并返回一个非常空的主机构建器,足以让 EF 完成它的工作。

这感觉有点像 hack,以后可能无法使用。

【讨论】:

    【解决方案2】:

    根据@frogerdevs帮助。需要实施:

    将 Startup 与新的最小托管模式一起使用

    来自 Microsoft 迁移到 .NET 6.0 的文章:

    https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60?view=aspnetcore-6.0&tabs=visual-studio

    【讨论】:

      【解决方案3】:

      基本上它告诉您您尝试删除的迁移已经应用于您的本地数据库,所以它不会删除它,您需要运行

      dotnet ef database update previous-migration-id

      然后你可以运行

      dotnet ef migration remove

      【讨论】:

      • 嘿,这不是有效的答案。我已经使用过 dotnet ef 数据库更新命令 previous-migration。成功执行后,我执行 dotnet ef migration remove。我的应用程序以某种方式从控制台开始,并在调用 Migrate() 的某个地方应用我想要删除的迁移,然后它说它已经应用于数据库。
      猜你喜欢
      • 2022-07-19
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 2012-05-06
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      相关资源
      最近更新 更多