我建立一個ASP.Net核心API,我一直沒有能夠找到一種方法來從DBContextOptions獲取連接字符串。我如何從SqlServerDBContextOptionsExtensions在ASP.Net核心
我在我的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= .....");
}
我可以看到Startup.cs從appsettings.json文件中獲取正確的連接字符串時,我調試和檢查Configuration.GetConnectionString值(「MainConnection」)。
我認爲,經過選擇進入的DbContext類通過DI會通過連接字符串,但DbContect類沒有工作,除非我有optionBuilder.UseSqlServer()在OnConfiguring方法。
我發現這個SO發佈https://stackoverflow.com/questions/33532599/asp-net-5-multiple-dbcontext-problems,大約使用下面的代碼會談提取選項屬性
public ResourceDbContext(DbContextOptions options) : base(options)
{
_connectionString = ((SqlServerOptionsExtension)options.Extensions.First()).ConnectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer(_connectionString);
}
連接字符串,但是當我嘗試使用它,我發現有不再在options.Extensions
所以,我的第一個問題是首先()方法...
爲什麼沒有的DbContext類的工作,而無需添加連接字符串中的OnConfiguring方法
我的第二個問題是...
如果連接字符串在OnCOnfiguring方法所需要的,我怎麼能得到它從DbContextOptions選項對象,而不是明確地提供它在OnConfiguring方法 - > optionsBuilder .UseSqlServer(@「Server = .....」);