Implement some way to specify/find a DbContext and IDesignTimeDbContextFactory such that BuildWebHost is never called even if it is present. This should allow a clean escape hatch to be used when building the service provider has side effects that the app needs to prevent.
See discussion in #9033
To prevent EF Core from calling Program.BuildWebHost(), rename it.
Just comment what is in Configure() from Startup when you use the tools for migrations.
Is there an issue in Hosting that we should report here? If we only ever access the service provider from the IWebHost, why is it calling Startup.Configure()?
From what I see at a quick look on the code BuildWebHost will always call that.
There is a method there seems that is called in BuildWebHost
C#
private static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName)
{
return new ConfigureBuilder(StartupLoader.FindMethod(startupType, "Configure{0}", environmentName, typeof (void), true));
}
Maybe I'm wrong
@bricelam AFAIR there was a conversation about this around the preview 1 timeframe when there was an exception thrown because there was no certificate to run the web host in production mode. Our general feedback was that the call to .Build() was doing way too much work eagerly which intuitively seemed to belong in .Run().
If this doesn't change .Build() will still really be a poor choice of an entry point for design time.
@glennc said he would follow up on that. Not sure if issues have been filed.
@divega to follow up with @glennc and/or hosting.
I have a seed code on Startup.cs file which throws exception since there is no database. It should not run Program.cs if there is a IDesignTimeDbContextFactory implementation.
Note from triage: this hasn't shown itself to be a major problem so far, so we are closing this issue for now. If you hit this then please provide some feedback on this issue and we will re-assess based on the feedback.
It's unclear to me how this is not a major problem with an easy fix.
I didn't know or expected this behavior, so every time I ran "dotnet ef database update" all my configuration would load, a connection would be made to my RabbitMQ instances etc etc... causing the migration to fail if something went wrong there.
Please re-consider.
Can't you just check if there's IDesignTimeDbContextFactory implemented and if not fall back to calling BuildWebhost?
Any solution ?
I don't understand how this is closed. It's still a problem! My app does configuration value verification at startup and those values are blank when migrations are scripted during a build because I don't want secrets checked into source control. They get set only at release time, when the migrations have already been generated and packaged in the build artifact.
@eavonius Can you create a new issue? We could avoid app service discover entirely if...
Most helpful comment
Workaround
To prevent EF Core from calling
Program.BuildWebHost(), rename it.