由于 appsettings.json 的路径,add-migration 无法从文件 appsettings.json 读取连接字符串

der*_*cki 4 c# entity-framework-core asp.net-core asp.net-core-2.0 asp-net-core-spa-services

工具:VS2017、ASP.NET Core 2、Entity Framework Core 2、ASP.NET Core JavaScript 服务

我正在使用以下 BuildWebHost 方法:

public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
    .UseStartup<Startup>()
    .UseNLog()
    .Build();
Run Code Online (Sandbox Code Playgroud)

为了加载连接字符串,我在 ConfigureServices (startup.cs) 中有以下代码:

Action<DbContextOptionsBuilder> optionsAction = options =>
    options.UseSqlServer(Configuration.GetConnectionString("RecipeDatabase")); 
services.AddDbContext<RecipeContext>(optionsAction);
Run Code Online (Sandbox Code Playgroud)

使用上述配置,应用程序在调试模式和作为 Windows 服务(发布后)运行时没有问题。

但是,如果我运行 add-migration,该工具将无法从 appsettings.json 加载连接字符串:

在此处输入图片说明

如果我像这样评论以下行

//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
Run Code Online (Sandbox Code Playgroud)

add-migration 运行没有问题,但应用程序作为“Windows 服务”运行并不是因为它找不到 appsettings.json 文件。

如何修改配置以便不再需要评论以上行?

谢谢你。

迈克尔

Pes*_*ska 6

您可能希望覆盖 DbContext 中的 OnConfiguring 方法。这是我正在使用的示例。每当您使用命令行或 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);
}
Run Code Online (Sandbox Code Playgroud)