Tools: VS2017, ASP.NET Core 2, Entity Framework Core 2, ASP.NET Core JavaScript Services
I am using the following BuildWebHost methode:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
.UseStartup<Startup>()
.UseNLog()
.Build();
For loading the connection string I have the following code in ConfigureServices (startup.cs):
Action<DbContextOptionsBuilder> optionsAction = options =>
options.UseSqlServer(Configuration.GetConnectionString("RecipeDatabase"));
services.AddDbContext<RecipeContext>(optionsAction);
With the above configuration the app runs without problems in debug mode and as windows service (after publishing).
But if I run add-migration the tool is not able to load the connection string from appsettings.json:
If I comment the following line like so
//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
add-migration runs without problems but the app running as "Windows Service" not because it will not find the appsettings.json file.
How can I modify the configuration so that it is not necessary to comment the above line anymore?
Thank you.
Michael
You might want to override OnConfiguring method in your DbContext. Here is an example I'm using. It will work whenever you are using command line or windows service:
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);
}