应用程序为什么要以"dotnet ef migrations add"开头?

7

我在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'已经被应用到数据库中。将其还原并重试。如果迁移已经应用到其他数据库,请考虑使用新的迁移来还原其更改。

看起来像是死循环。


真正的问题是“启动应用程序”还是“迁移已经应用了”? - Lei Yang
真正的问题是启动应用程序并在应用程序内调用Migrate()方法,导致dotnet ef migrations remove push错误,提示迁移已经应用。 - hoozr
当您说“启动应用程序”时,是否意味着应用程序的 UI/进程已被启动? - Lei Yang
仅 API。 托管环境:开发环境 内容根路径:C:\Users\hoozr\source\repos\portal-web\src\Only.Portal.Web 正在侦听:http://localhost:5000 正在侦听:https://localhost:5001 应用已启动。按 Ctrl+C 关闭应用。 - hoozr
3个回答

5
我对作者自己所标记的“已接受的解决方案”不满意。我不清楚实际的“解决方案”是什么。只提到应该“使用启动项”,没有提及真正解决问题的确切内容。
我正在运行一个.NET 6 ASP.NET应用程序,使用最小API启动,并遇到了同样的问题。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完成其工作。

这感觉有点像黑客技巧,也许在以后的日期可能不起作用。


0

-1

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

dotnet ef database update previous-migration-id

然后你可以运行

dotnet ef migration remove


嘿,那不是有效的答案。我已经使用了dotnet ef database update命令进行了先前的迁移。并且在成功执行后,我执行了dotnet ef migration remove。但是我的应用程序在控制台中以某种方式启动,并在某个地方调用Migrate()来应用我想要删除的迁移,之后它会说它已经被应用到数据库中了。 - hoozr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接