如何在.NETCore 中读取连接字符串?

我只想从一个配置文件中读取一个连接字符串,并为此添加一个名为“ appsetings.json”的文件到我的项目中,并在其中添加以下内容:

{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-


WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

在 ASP.NET 上,我用了这个:

 var temp=ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

现在我如何在 C # 中读取“ DefaultConnection”并将其存储在.NET Core 中的字符串变量中呢?

319463 次浏览

您可以使用 GetConnectionString 扩展方法来实现这一点:

string conString = Microsoft
.Extensions
.Configuration
.ConfigurationExtensions
.GetConnectionString(this.Configuration, "DefaultConnection");


System.Console.WriteLine(conString);

或者用于 DI 的结构化类:

public class SmtpConfig
{
public string Server { get; set; }
public string User { get; set; }
public string Pass { get; set; }
public int Port { get; set; }
}

创业:

public IConfigurationRoot Configuration { get; }




// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// http://developer.telerik.com/featured/new-configuration-model-asp-net-core/
// services.Configure<SmtpConfig>(Configuration.GetSection("Smtp"));
Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<SmtpConfig>(services, Configuration.GetSection("Smtp"));

然后是家庭控制器:

public class HomeController : Controller
{


public SmtpConfig SmtpConfig { get; }
public HomeController(Microsoft.Extensions.Options.IOptions<SmtpConfig> smtpConfig)
{
SmtpConfig = smtpConfig.Value;
} //Action Controller




public IActionResult Index()
{
System.Console.WriteLine(SmtpConfig);
return View();
}

在 appsetings.json:

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true"
},


"Smtp": {
"Server": "0.0.0.1",
"User": "user@company.com",
"Pass": "123456789",
"Port": "25"
}

我发现解决这个问题的方法是在 Startup 的构建器中使用 AddJsonFile (这允许它找到存储在 appsetings.json 文件中的配置) ,然后使用它来设置 private _ config 变量

public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
_config = builder.Build();
}

然后我可以设置配置字符串如下:

var connectionString = _config.GetConnectionString("DbContextSettings:ConnectionString");

这是在 dotnet 核心1.1

公布的答案是好的,但没有直接回答我有关读取连接字符串的相同问题。通过大量的搜索,我找到了一种稍微简单一点的方法。

在 Startup.cs 中

public void ConfigureServices(IServiceCollection services)
{
...
// Add the whole configuration object here.
services.AddSingleton<IConfiguration>(Configuration);
}

在控制器中,为配置添加一个字段,并在构造函数上为其添加一个参数

private readonly IConfiguration configuration;


public HomeController(IConfiguration config)
{
configuration = config;
}

现在,在视图代码中,您可以这样访问它:

connectionString = configuration.GetConnectionString("DefaultConnection");

更多信息见链接: Https://learn.microsoft.com/en-us/ef/core/miscellaneous/connection-strings

JSON

    {
"ConnectionStrings": {
"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
},
}

C # Startup.cs

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

编辑: aspnetcore,从3.1开始: Https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

我有一个数据访问库,可以同时使用.net 核心和.net 框架。

魔术开始了。Net 核心项目将连接字符串保存在一个名为“ app.config”的 xml 文件中(同样适用于 web 项目) ,并将其标记为“复制到输出目录”,

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="conn1" connectionString="...." providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>

ConfigurationManager.ConnectionStrings-将读取连接字符串。

    var conn1 = ConfigurationManager.ConnectionStrings["conn1"].ConnectionString;

还有一个办法。在我的例子中,你可以看到存储库类中的一些业务逻辑,我在 ASP 依赖注入中使用这些逻辑。NET MVC Core 3.1.

在这里,我想获得 connectiongString的业务逻辑,因为可能另一个存储库可以访问另一个数据库。

此模式允许您在相同的业务逻辑存储库中访问不同的数据库。

C #

public interface IStatsRepository
{
IEnumerable<FederalDistrict> FederalDistricts();
}


class StatsRepository : IStatsRepository
{
private readonly DbContextOptionsBuilder<EFCoreTestContext>
optionsBuilder = new DbContextOptionsBuilder<EFCoreTestContext>();
private readonly IConfigurationRoot configurationRoot;


public StatsRepository()
{
IConfigurationBuilder configurationBuilder = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
configurationRoot = configurationBuilder.Build();
}


public IEnumerable<FederalDistrict> FederalDistricts()
{
var conn = configurationRoot.GetConnectionString("EFCoreTestContext");
optionsBuilder.UseSqlServer(conn);


using (var ctx = new EFCoreTestContext(optionsBuilder.Options))
{
return ctx.FederalDistricts.Include(x => x.FederalSubjects).ToList();
}
}
}

Appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"EFCoreTestContext": "Data Source=DESKTOP-GNJKL2V\\MSSQLSERVER2014;Database=Test;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}

NET Core (在我的情况下 < strong > 3.1 )为我们提供了 构造函数注入控制器,因此您可以简单地添加以下构造函数:

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
private readonly IConfiguration m_config;


public TestController(IConfiguration config)
{
m_config = config;
}


[HttpGet]
public string Get()
{
//you can get connection string as follows
string connectionString = m_config.GetConnectionString("Default")
}
}

下面是 appsetings.json 可能的样子:

{
"ConnectionStrings": {
"Default": "YOUR_CONNECTION_STRING"
}
}

在3.1中,已经为“ ConnectionStrings”定义了一个部分

System.Configuration

定义 :

  "ConnectionStrings": {
"ConnectionString": "..."
}

登记册 :

public void ConfigureServices(IServiceCollection services)
{
services.Configure<ConnectionStringSettings>(Configuration.GetSection("ConnectionStrings"));
}

注射 :

public class ObjectModelContext : DbContext, IObjectModelContext
{


private readonly ConnectionStringSettings ConnectionStringSettings;


...


public ObjectModelContext(DbContextOptions<ObjectModelContext> options, IOptions<ConnectionStringSettings> setting) : base(options)
{
ConnectionStringSettings = setting.Value;
}


...
}

使用 :

   public static void ConfigureContext(DbContextOptionsBuilder optionsBuilder, ConnectionStringSettings connectionStringSettings)
{
if (optionsBuilder.IsConfigured == false)
{
optionsBuilder.UseLazyLoadingProxies()
.UseSqlServer(connectionStringSettings.ConnectionString);
}
}

太晚了,但是在阅读了所有有用的答案和评论之后,我最终使用了 微软。扩展。配置。活页夹扩展包,并花了一点时间去掉了硬编码的配置键。

我的解决办法是:

Iconfigsection.cs

public interface IConfigSection
{
}

Configurationextensions.cs

public static class ConfigurationExtensions
{
public static TConfigSection GetConfigSection<TConfigSection>(this IConfiguration configuration) where TConfigSection : IConfigSection, new()
{
var instance = new TConfigSection();
var typeName = typeof(TConfigSection).Name;
configuration.GetSection(typeName).Bind(instance);


return instance;
}
}

Appsettings.json

{
"AppConfigSection": {
"IsLocal": true
},
"ConnectionStringsConfigSection": {
"ServerConnectionString":"Server=.;Database=MyDb;Trusted_Connection=True;",
"LocalConnectionString":"Data Source=MyDb.db",
},
}

要访问强类型配置,只需要为其创建一个类,该类实现 图形配置部分接口(注意: 类名和字段名应该与 Appsettings.json中的节完全匹配)

Appconfigsection.cs

public class AppConfigSection: IConfigSection
{
public bool IsLocal { get; set; }
}

Connectionstringsconfigsection.cs

public class ConnectionStringsConfigSection : IConfigSection
{
public string ServerConnectionString { get; set; }
public string LocalConnectionString { get; set; }


public ConnectionStringsConfigSection()
{
// set default values to avoid null reference if
// section is not present in appsettings.json
ServerConnectionString = string.Empty;
LocalConnectionString = string.Empty;
}
}

最后,一个用法例子:

Startup.cs

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}


public IConfiguration Configuration { get; }


public void ConfigureServices(IServiceCollection services)
{
// some stuff


var app = Configuration.GetConfigSection<AppConfigSection>();
var connectionStrings = Configuration.GetConfigSection<ConnectionStringsConfigSection>();


services.AddDbContext<AppDbContext>(options =>
{
if (app.IsLocal)
{
options.UseSqlite(connectionStrings.LocalConnectionString);
}
else
{
options.UseSqlServer(connectionStrings.ServerConnectionString);
}
});


// other stuff
}
}

为了整洁起见,您可以将上面的代码移动到扩展方法中。

就这样,没有硬编码的配置密钥。

我是这么做的:

我在 appsetings.json 添加了连接字符串

"ConnectionStrings": {
"conStr": "Server=MYSERVER;Database=MYDB;Trusted_Connection=True;MultipleActiveResultSets=true"},

我创建了一个叫做 SqlHelper 的类

public class SqlHelper
{
//this field gets initialized at Startup.cs
public static string conStr;


public static SqlConnection GetConnection()
{
try
{
SqlConnection connection = new SqlConnection(conStr);
return connection;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}

在 Startup.cs 中,我使用 ConfigurationExtension.GetConnectionString 获取连接,并将其分配给 SqlHelper.conStr

public Startup(IConfiguration configuration)
{
Configuration = configuration;
SqlHelper.connectionString = ConfigurationExtensions.GetConnectionString(this.Configuration, "conStr");
}

现在,不管你需要连接字符串的哪个地方,你都可以这样称呼它:

SqlHelper.GetConnection();
private readonly IConfiguration configuration;
public DepartmentController(IConfiguration _configuration)
{
configuration = _configuration;
}


[HttpGet]
public JsonResult Get()
{
string sqlDataSource = configuration["ConnectionStrings:DefaultConnection"];

在.NET Core 6中

Appsettings.json

 "ConnectionStrings": {
"DefaultConnection": "Server=**Server Name**;Database=**DB NAME**;Trusted_Connection=True;MultipleActiveResultSets=true"
}

程序

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString));

数据库上下文

public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{


}


}

如果您想将 appsetings.json 中的 ConnectionString 放入 Model 或 ViewModel (而不是 Controller)中,那么下面的方法可以很好地工作。这是针对 ASP.NET Core 3及以上版本的。有时候你可能需要在一个模型中加入一个 ConnectionString (用于 SQL 查询) ,而不是通过控制依赖注入,这样下面的方法就可以从应用程序设置中获取 ConnectionString:

public class NameOfYourModel
{
static class getConnection
{
public static IConfigurationRoot Configuration;
public static string GetConnectionString()
{
var builder = new ConfigurationBuilder()
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
var connectionString =
Configuration.GetConnectionString("connectionStringName");
       

return connectionString;
}
}
string connStr = getConnection.GetConnectionString().ToString(); //This
//line now has your connectionString which you can use.


//Continue the rest of your code here.
}