[英]How do I get the connection string from the SqlServerDBContextOptionsExtensions in ASP.Net Core
我正在構建一個ASP.Net核心API,我無法找到從DBContextOptions獲取連接字符串的方法。
我在我的startup.cs中有DBContext,如下所示;
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddEntityFrameworkSqlServer()
.AddDbContext<MainContext>(options => options.UseSqlServer(Configuration.GetConnectionString("MainConnection")));
services.AddMvc()
.AddJsonOptions(opt =>
{
opt.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
}
在我的Context類中,我有以下構造函數;
public MainContext(DbContextOptions<MainContext> options) : base(options)
{
}
但它不起作用,除非我在DBContext類OnConfiguring方法中添加一個實際的連接字符串,如下所示;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//TODO Move connection string to a secure location
optionsBuilder.UseSqlServer(@"Server= .....");
}
我可以看到,當我調試並檢查Configuration.GetConnectionString(“MainConnection”)中的值時,Startup.cs從appsettings.json文件中獲取正確的連接字符串。
我認為通過DI將選項傳遞到DbContext類會傳遞連接字符串,但DbContect類不起作用,除非我在OnConfiguring方法中有optionBuilder.UseSqlServer()。
我發現這個SO帖子https://stackoverflow.com/questions/33532599/asp-net-5-multiple-dbcontext-problems ,它談到使用以下代碼從options屬性中提取連接字符串
public ResourceDbContext(DbContextOptions options) : base(options)
{
_connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer(_connectionString);
}
但是當我嘗試使用它時,我發現options.Extensions中不再有First()方法
所以,我的第一個問題是......
為什么DBContext類不工作而不必在OnConfiguring方法中添加連接字符串
我的第二個問題是......
如果OnCOnfiguring方法中需要連接字符串,我如何從DbContextOptions選項對象獲取它,而不必在OnConfiguring方法中顯式提供它 - > optionsBuilder.UseSqlServer(@“Server = .....”) ;
在你的appsettings.json
里面你會創建以下內容:
{
"Database" : {
"ConnectionString" : "..."
}
}
然后在您的ConfigureServices
您將執行以下操作:
services.AddSingleton(_ => Configuration);
這將基本上填充IConfigurationRoot
屬性。 您可以在任何地方注入,並通過執行以下操作訪問連接字符串:
private readonly IConfigurationRoot configuration;
private IDbConnection dbConnection { get; }
public Example(IConfigurationRoot configuration)
{
this.Configuration = configuration;
dbConnection = new SqlConnection(this.configuration.GetConnectionString("..."));
}
我的結構有點奇怪,你真的會簡單地將ConnectionString
傳遞給另一個類,或者注入方法,但這會為你演示。 但我相信Entity Framework 7有一個工廠直接接受連接字符串。 希望這會幫助你。
在Entity Framework中,它應該在您的ConfigureServices
是這樣的:
services.AddSingleton<dbContext>(_ => new dbContext(Configuration.GetConnectionString("...")));
public class dbContext : DbContext
{
public dbContext(string dbConnection) : base(dbConnection)
{
}
}
一些額外的文檔 。
至少對於EF Core 1.1,您需要使用FindExtension<SqlServerOptionsExtension>()
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure.Internal;
namespace MyNamespace
{
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options)
{
var sqlServerOptionsExtension =
options.FindExtension<SqlServerOptionsExtension>();
if(sqlServerOptionsExtension != null)
{
string connectionString = sqlServerOptionsExtension.ConnectionString;
}
}
}
}
如果您在Startup.cs
使用opt.UseInMemoryDatabase()
, opt.UseInMemoryDatabase()
空檢查
對於EntityFrameworkCore 2.1.4
,您的連接字符串在appsettings.json
應該是這樣的
"ConnectionStrings": {
"Connection1": "....",
"Connection2": "..."
},
將以下行添加到Startup.cs
的ConfigureServices
方法
services.AddSingleton(provider => Configuration);
在這些線之后,
services.AddDbContext<MyContextContext>
(options => options.UseSqlServer(Configuration.GetConnectionString("Connection1")));
services.AddScoped<DbContext, MyContext>();
您的數據庫上下文類應該修改如下。
public partial class MyContext : DbContext
{
private readonly IConfiguration _configuration;
private IDbConnection DbConnection { get; }
public MyContext(DbContextOptions<MyContext> options, IConfiguration configuration)
: base(options)
{
this._configuration = configuration;
DbConnection = new SqlConnection(this._configuration.GetConnectionString("Connection1"));
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(DbConnection.ToString());
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.