从appsettings.json获取ConnectionString,而不是在.NET Core 2.0 App中进行硬编码

bor*_*sdj 43 connection-string appsettings asp.net-core

我在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当Database不存在时,在Core 2.0中需要进行迁移,并且必须在运行update-database时创建.
升级到ASP.NET Core 2.0后无法创建迁移

我想在2个地方(这里和appsettings.json)没有ConnectionString,但只在.json,所以我试图更换

"Server=localhost;Database=DbName;Trusted_Connection=True;MultipleActiveResultSets=true"
Run Code Online (Sandbox Code Playgroud)

ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我得到空值.

更新1:
请注意,在Core 2中明确添加.json是不必要的,所以问题不在于文件.
https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/

更新2:
此外,我已经使用Configuration从.json向Context发送ConnectionString:

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")));
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我不能将它用于ToDoContextFactory,因为它没有配置,并且迁移使用ToDoContextFactory,因此App根本没有运行.

解决方案:基于@JRB的答案,我使它的工作方式如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

JRB*_*JRB 59

第1步:在OnConfiguring()中包含以下内容

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
            .AddJsonFile("appsettings.json")
            .Build();
        optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
    }
Run Code Online (Sandbox Code Playgroud)

第2步:创建appsettings.json:

  {
    "ConnectionStrings": {       
      "DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"        
    } 
  }
Run Code Online (Sandbox Code Playgroud)

第3步:将appsettings.json硬拷贝到正确的目录

  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.        
Run Code Online (Sandbox Code Playgroud)

假设:您已经在项目中包含了Microsoft.Extensions.Configuration.Json(从Nuget获取)包.

  • 我不同意!使用内部连接字符串"复制`appsettings.json`"与在2个位置声明连接字符串一样糟糕!谁将负责保持它不同步? (2认同)
  • 我和borisdj遇到的问题的背景是.NET Core 2.0 System.Configuration不再存在,需要更换.为了让其他人容易理解答案,我在步骤3中选择硬拷贝方法.但你当然是正确的,在现实世界的场景中,你将"appsetting.json"添加到你的项目中,并在"属性页"的"常规 - 高级"选项卡中将"复制到输出目录"设置为"始终复制" ",之后不再需要手动复制动作. (2认同)
  • 如果您想从“appsettings.json”的自定义部分获取连接字符串,请检查此 /sf/answers/3774742961/ (2认同)

Kev*_*von 9

上面的解决方案和 Microsoft 文档中都缺少一些东西。如果您按照上述文档中链接的 GitHub 存储库的链接进行操作,您将找到真正的解决方案。

我认为混淆在于许多人使用的默认模板包含启动的默认构造函数,因此人们不一定知道注入的配置来自哪里。

因此,在 Startup.cs 中,添加:

 public IConfiguration Configuration { get; }
 public Startup(IConfiguration configuration) 
 {
     Configuration = configuration;
 }
Run Code Online (Sandbox Code Playgroud)

然后在 ConfigureServices 方法中添加其他人所说的...

services.AddDbContext<ChromeContext>(options =>                    
    options.UseSqlServer(Configuration.GetConnectionString("DatabaseConnection")));
Run Code Online (Sandbox Code Playgroud)

你还必须确保你已经创建了 appsettings.json 文件并且有一个与此类似的连接字符串部分

{
  "ConnectionStrings": {
    "DatabaseConnection": "Server=MyServer;Database=MyDatabase;Persist Security Info=True;User ID=SA;Password=PASSWORD;MultipleActiveResultSets=True;"
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,您必须对其进行编辑以反映您的配置。

要记住的事情。这是在 .Net Standard 2.1 项目中使用 Entity Framework Core 3 测试的。我需要为以下项目添加 nuget 包:Microsoft.EntityFrameworkCore 3.0.0 Microsoft.EntityFrameworkCore.SqlServer 3.0.0,因为这是我正在使用的,也是访问 UseSqlServer 所需的。


Ism*_*mar 7

我知道这已被标记为已回答,但是当我在一个项目中工作时遇到了一些问题,我的EF Core 数据访问层位于 .DLL 项目中,与项目的其余部分、API、Auth 和Web 并且大多会喜欢我的其他项目来引用这个数据项目。而且我不想每次都进入Data项目更改连接字符串。

步骤 1:将其包含在 OnConfiguring 方法中

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
           var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
           IConfigurationRoot configuration = new ConfigurationBuilder()
                **.SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))**
                .AddJsonFile("appsettings.json", optional: false)
                .AddJsonFile($"appsettings.{envName}.json", optional: false)
                .Build();
           optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));
      }
Run Code Online (Sandbox Code Playgroud)

注意: .SetBasePath(Path.Combine(Directory.GetCurrentDirectory())) 这将否定或使将文件复制到目录的需要无效,因为 ASP.NET CORE 足够聪明,可以选择正确的文件。假设选择了 Prod 环境文件,指定的环境也会在为发布或生产构建时选择正确的文件。

第 2 步:创建 appsettings.json

{
"ConnectionStrings": {       
  "DefaultConnection": "Server=YOURSERVERNAME; Database=YOURDATABASENAME; Trusted_Connection=True; MultipleActiveResultSets=true"        
} 
Run Code Online (Sandbox Code Playgroud)

}

请:参考:Microsoft.Extensions.Configuration


Gre*_*Gum 6

如果您使用“顶级语句”,您可以按如下方式获取连接字符串:

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
Run Code Online (Sandbox Code Playgroud)


Joh*_*tad 5

将它作为 dp 注入传递给该类怎么样?在配置服务中:

services.Configure<MyOptions>(Configuration);
Run Code Online (Sandbox Code Playgroud)

创建类来保存 json 字符串:

public class MyOptions
{
    public MyOptions()
    {

    }
    public string Option1 { get; set; }
    public string Option2 { get; set; }
}    
Run Code Online (Sandbox Code Playgroud)

将字符串添加到 json 文件:

"option1": "somestring",
"option2": "someothersecretstring"
Run Code Online (Sandbox Code Playgroud)

在需要这些字符串的类中,作为构造函数传入:

public class SomeClass
{
 private readonly MyOptions _options;

    public SomeClass(IOptions<MyOptions> options)
    {
        _options = options.Value;           
    }    

 public void UseStrings()
 {
   var option1 = _options.Option1;
    var option2 = _options.Option2;
 //code
 }
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*kov 5

在ASPNET Core中,您可以在 Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<BloggingContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}
Run Code Online (Sandbox Code Playgroud)

您的连接在哪里定义 appsettings.json

{
  "ConnectionStrings": {
    "BloggingDatabase": "..."
  },
}
Run Code Online (Sandbox Code Playgroud)

来自MS docs的示例

  • 如果我想在不同的项目中使用 DbContext,例如当 DA 层有一个单独的项目时,该怎么办? (3认同)

归档时间:

查看次数:

104485 次

最近记录:

6 年,4 月 前