当前,所有默认的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/