当前,所有默认的Startup.cs流都在每个与数据库相关的操作上执行,例如删除db,添加迁移,将db更新为迁移等。

我在Startup中有大量特定于应用程序的代码,仅当应用程序实际运行时才需要调用该代码。因此,如何检测迁移或其他与数据库相关的Startup命令运行的dotnet类。

最佳答案

嗯,正如在评论问题中已经注意到的那样,有一个IDesignTimeDbContextFactory接口(interface),需要在设计时实现该接口(interface)以解决DbContext

它可能看起来像这样:

public static class Programm{
    ...
    public static IWebHost BuildWebHostDuringGen(string[] args)
    {
            return WebHost.CreateDefaultBuilder(args)
                .UseStartup<StartupGen>()  // <--- I'm just using different Startup child there where could be less complex code
                .UseDefaultServiceProvider(options => options.ValidateScopes = false).Build();
    }
}

public class DbContextFactory : IDesignTimeDbContextFactory<MyDbContext>
    {
        public MyDbContex CreateDbContext(string[] args)
        {
            return Program.BuildWebHostDuringGen(args).Services.GetRequiredService<MyDbContext>();
        }
    }

但是,由于一些不清楚的原因(我问微软的人,但他们没有向我解释),即使是私有(private)操作,当前每个操作上的dotnet也会隐式调用Programm.BuildWebHost-这就是为什么问题的作者每次都要执行标准流程的原因。解决方法-重命名 Programm.BuildWebHost 为其他名称,例如InitWebHost
有一个issue created,所以也许将来会在2.1版本中解决。

关于asp.net-core - Asp.Net Core 2.0 : Detect Startup class invoked from migration or other ef operation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45694055/

10-11 10:57