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

时间:2018-03-25 13:38:53

标签: c# asp.net-core entity-framework-core asp.net-core-2.0 asp-net-core-spa-services

工具:VS2017,ASP.NET Core 2,Entity Framework Core 2,ASP.NET核心JavaScript服务

我正在使用以下BuildWebHost方法:

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

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

Action<DbContextOptionsBuilder> optionsAction = options =>
    options.UseSqlServer(Configuration.GetConnectionString("RecipeDatabase")); 
services.AddDbContext<RecipeContext>(optionsAction);

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

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

enter image description here

如果我评论以下这样的行

//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))

添加迁移运行没有问题,但运行为“Windows服务”的应用程序不是因为它找不到appsettings.json文件。

如何修改配置,以便不再评论上述行?

谢谢。

迈克尔

2 个答案:

答案 0 :(得分:3)

您可能希望在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);
}

答案 1 :(得分:0)

在开发环境中,最好使用“User Secrets”来存储配置而不是appsettings.json。您在解决方案资源管理器上获得用户秘密&gt;项目的上下文菜单&gt;管理用户秘密。

用户秘密将配置存储在当前用户的漫游配置文件目录中,例如:C:\ users \ john \ AppData \ Roaming \ Microsoft \ UserSecrets \ ProjectName012822aasd \ secrets.json

虽然User Secrets选项仅适用于开发环境,但对于生产,您需要依赖其他配置管理,例如:Azure App Service的App Config。

这是Microsoft关于User Secrets

的文档