从 appsettings.json 获取 ConnectionString 而不是在 .NET Core 2.0 App 中硬编码 [英] Get ConnectionString from appsettings.json instead of being hardcoded in .NET Core 2.0 App
问题描述
我在 NET Core2.0 App 中有以下类.
I have the following class in NET Core2.0 App.
// required when local database does not exist or was deleted
public class ToDoContextFactory : IDesignTimeDbContextFactory<AppContext>
{
public AppContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer("Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true");
return new AppContext(builder.Options);
}
}
这在 Core 2.0 中是必需的,当数据库不存在时进行迁移,并且必须在您运行 update-database 时创建.
升级到 ASP 后无法创建迁移.NET 核心 2.0
This is required in Core 2.0 with migration when Database does not exist and has to be created when you run update-database.
Unable to create migrations after upgrading to ASP.NET Core 2.0
我不希望在 2 个地方(这里和 appsettings.json 中)没有 ConnectionString,而只在 .json 中所以我尝试更换
I would like not having ConnectionString in 2 places(here and in appsettings.json) but only in .json so I have tried to replace
"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
与
ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
但它不起作用,我得到了空值.
but it's not working, I'm getting null value.
更新1:
请注意,在 Core 2 中不需要显式添加 .json,所以问题不在于文件.
https://andrewlock.net/explore-program-and-startup-in-asp-net-core-2-preview1-2/
更新 2:
此外,我已经在使用配置将 ConnectionString 从 .json 发送到上下文:
UPDATE 1:
Just to note that adding explicitly .json is not necessery in Core 2 so the problem is not with the file.
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/
UPDATE 2:
Also I am already using Configuration for sending ConnectionString from .json to Context:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}
}
但是我不能将它用于 ToDoContextFactory,因为它没有配置,并且 ToDoContextFactory 被迁移使用,因此应用程序根本没有运行.
But I can not use this for ToDoContextFactory because it does not have Configuration, and ToDoContextFactory is used by migrations so the App is not running at all.
解决方案:根据@JRB 的回答,我让它像这样工作:
SOLUTION: Based on answer from @JRB I made it work like this:
public AppContext CreateDbContext(string[] args)
{
string projectPath = AppDomain.CurrentDomain.BaseDirectory.Split(new String[] { @"bin" }, StringSplitOptions.None)[0];
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(projectPath)
.AddJsonFile("appsettings.json")
.Build();
string connectionString = configuration.GetConnectionString("DefaultConnection");
var builder = new DbContextOptionsBuilder<AppContext>();
builder.UseSqlServer(connectionString);
return new AppContext(builder.Options);
}
推荐答案
STEP 1: 在 OnConfiguring() 中包含以下内容
STEP 1: Include the following in OnConfiguring()
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json")
.Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
}
第 2 步:创建 appsettings.json:
STEP 2: Create appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"
}
}
第 3 步:将 appsettings.json 硬拷贝到正确的目录
STEP 3: Hard copy appsettings.json to the correct directory
Hard copy appsettings.json.config to the directory specified in the AppDomain.CurrentDomain.BaseDirectory directory.
Use your debugger to find out which directory that is.
假设:您的项目中已经包含 Microsoft.Extensions.Configuration.Json 包(从 Nuget 获取).
Assumption: you have already included package Microsoft.Extensions.Configuration.Json (get it from Nuget) in your project.
这篇关于从 appsettings.json 获取 ConnectionString 而不是在 .NET Core 2.0 App 中硬编码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!