Strumenti: VS2017, ASP.NET Core 2, Entity Framework Core 2, servizi JavaScript ASP.NET Core
Sto usando il seguente metodo BuildWebHost:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
.UseStartup<Startup>()
.UseNLog()
.Build();
Per caricare la stringa di connessione, ho il seguente codice in ConfigureServices (startup.cs):
Action<DbContextOptionsBuilder> optionsAction = options =>
options.UseSqlServer(Configuration.GetConnectionString("RecipeDatabase"));
services.AddDbContext<RecipeContext>(optionsAction);
Con la configurazione di cui sopra l'applicazione funziona senza problemi in modalità di debug e come servizio di Windows (dopo la pubblicazione).
Ma se eseguo add-migration lo strumento non è in grado di caricare la stringa di connessione da appsettings.json:
Se commento la seguente riga in questo modo
//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
add-migration viene eseguito senza problemi ma l'app viene eseguita come "servizio Windows" non perché non troverà il file appsettings.json.
Come posso modificare la configurazione in modo che non sia più necessario commentare la riga sopra?
Grazie.
Michael
Potresti voler sovrascrivere il metodo OnConfiguring nel tuo DbContext. Ecco un esempio che sto usando. Funzionerà ogni volta che si utilizza il servizio di riga di comando o di Windows:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (optionsBuilder.IsConfigured)
{
base.OnConfiguring(optionsBuilder);
return;
}
string pathToContentRoot = Directory.GetCurrentDirectory();
string json = Path.Combine(pathToContentRoot, "appsettings.json");
if (!File.Exists(json))
{
string pathToExe = Process.GetCurrentProcess().MainModule.FileName;
pathToContentRoot = Path.GetDirectoryName(pathToExe);
}
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
.SetBasePath(pathToContentRoot)
.AddJsonFile("appsettings.json");
IConfiguration configuration = configurationBuilder.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("RecipeDatabase"));
base.OnConfiguring(optionsBuilder);
}
Nell'ambiente di sviluppo, è preferibile utilizzare "User Secrets" per l'archiviazione della configurazione anziché di appsettings.json. Ottieni i segreti utente in Esplora soluzioni> Menu di scelta rapida del progetto> Gestisci segreti utente.
User Secrets memorizza la configurazione nella directory profilo romaing dell'utente corrente, ad esempio: C: \ users \ john \ AppData \ Roaming \ Microsoft \ UserSecrets \ ProjectName012822aasd \ secrets.json
Mentre l'opzione Segreti utente è pensata solo per l'ambiente di sviluppo, per la produzione è necessario affidarsi ad altra gestione della configurazione, ad esempio: App Config di App di Azure Service.
Ecco la documentazione di Microsoft su User Secrets