工具: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加载连接字符串:
如果我评论以下这样的行
//.UseContentRoot(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName))
添加迁移运行没有问题,但运行为“Windows服务”的应用程序不是因为它找不到appsettings.json文件。
如何修改配置,以便不再评论上述行?
谢谢。
迈克尔
答案 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
的文档