Search code examples
c#asp.net-coreentity-framework-coreasp.net-core-2.0asp-net-core-spa-services

add-migration can not read the connection string from the file appsettings.json because of the path to appsettings.json


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:

enter image description here

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


Solution

  • 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);
    }