![](/img/trans.png)
[英]Connection string from appsettings.json to OnConfiguring method in Entity Framework .NET Core
[英].Net Core 3 / Entity Framework Core putting connection string in Appsettings.json not working
.NET Core 仍然是新手,但我正在嘗試將我的連接字符串放入Appsettings.json
文件中。 我正在關注有關如何執行此操作的Microsoft 文檔,並且我認為我的所有設置都是正確的。
該項目將編譯並運行,但是當我點擊 API 時出現錯誤
沒有為此 DbContext 配置數據庫提供程序。
我使用了 EF Core 在我的上下文中放置的連接字符串,只是將其注釋掉,因此DbContext
的OnConfiguring
中實際上沒有任何內容。 這是連接到 Oracle 數據庫。
模型上下文.cs
public partial class ModelContext : DbContext
{
public ModelContext()
{
}
public ModelContext(DbContextOptions<ModelContext> options)
: base(options)
{
}
public virtual DbSet<Customer> Customer{ get; set; }
public virtual DbSet<HubToken> HubToken{ get; set; }
public virtual DbSet<Token> Token { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//if (!optionsBuilder.IsConfigured)
//{
// //optionsBuilder.UseOracle("user id=myusername;password=mypassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myserver)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=*****)))");
//}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Token>().HasNoKey();
modelBuilder.HasAnnotation("Relational:DefaultSchema", "MySCHEMA");
}
應用設置.json
"ConnectionStrings": {
"DbConnection": "user id=myusername;password=mypassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=servername)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=***)))"
}
啟動.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<ModelContext>(options => {
options.UseOracle(Configuration.GetConnectionString("DbConnection"));
});
}
更新
我調用 ModelContext 的代碼。 我最初使用注釋掉的“使用”語句來創建上下文。 這就是我在.Net Framework 中的做法,但 Core 似乎有所不同。 然后根據一些建議,我嘗試使用 using 語句嘗試將連接字符串傳遞給 ModelContext,但它也不喜歡那樣,因為此時連接字符串不可用。 在將連接字符串傳遞給 ModelContext 之前,我已經嘗試過先獲取連接字符串,但是這也不起作用,我只是不記得它是什么,因為我已經嘗試了幾件事。 我會說,至少目前看來它在 EF for.Net 中要簡單得多。 DbContext 會為我從 app.config 或 web.config 獲取連接字符串。 現在似乎在 Core 中做這件事需要付出更多的努力,但這可能只是因為我對 Core 的工作方式很陌生。
//using (var ctx = new ModelContext())
using (var ctx = new ModelContext(configuration.GetConnectionString("DbConnection")))
{
//Run the query and see if there are any results returned.
var results = ctx.Token.FromSqlRaw(sbQuery.ToString()).ToList();
if (results == null || results.Count == 0)
{
_logger.LogInformation("Api-Token not found in database. Access denied. Customer: {0} | Token: {1}", customer.ToString(), token.ToString());
context.Result = new BadRequestObjectResult("Access Denied. Invalid Token");
return;
}
if (!context.ModelState.IsValid)
{
_logger.LogInformation("Model is in-valid.");
context.Result = new BadRequestObjectResult(context.ModelState);
}
_logger.LogInformation("Api-Token is valid.");
return;
}
經過更多的研究和玩耍,我終於讓它工作了。 我正在發布我的更新,希望它能幫助其他人。
將我的連接字符串添加到appsettings.json
文件
"ConnectionStrings": {
"DbConnection": "user id=myusername;password=mypassword;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=servername)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=***)))"
}
然后將上下文信息添加到Startup.cs
文件中的 ConfigurationServices。 我相信這會將信息添加到依賴注入容器中。 我正在使用 Oracle 但您只需更改為options.UseSqlServer(connstring);
如果需要的話。 您可以通過在調試模式下放置斷點來驗證正確的連接字符串信息。
public void ConfigureServices(IServiceCollection services)
{
//setting connstring separately here just to be able confirm correct value.
var connstring = Configuration.GetConnectionString("DbConnection");
services.AddDbContext<ModelContext>(options =>
{
options.UseOracle(connstring);
});
}
在您的 Controller/Class 中,將上下文添加到頁面屬性並使用 class 構造函數從 DI 容器中獲取 DbContext。 然后使用using
語句並引用具有連接字符串信息的本地屬性。
public class TokenAuthorizationFilter : IAuthorizationFilter
{
private readonly ModelContext _context;
private readonly ILogger<TokenAuthorizationFilter> _logger;
public TokenAuthorizationFilter(ILogger<TokenAuthorizationFilter> logger, ModelContext context)
{
_logger = logger;
_context = context;
}
public void OnAuthorization(AuthorizationFilterContext context)
{
_logger.LogInformation("Authorizing Api-Token.");
//Get the values from the Request Header
context.HttpContext.Request.Headers.TryGetValue("Api-Token", out var token);
context.HttpContext.Request.Headers.TryGetValue("Customer", out var customer);
var sbQuery = new System.Text.StringBuilder();
sbQuery.Append("select * from YourUserTable ");
sbQuery.Append("where username=customer and password=token");
using (_context)
{
//Run the query and see if there are any results returned.
var results = _context.Token.FromSqlRaw(sbQuery.ToString()).ToList();
if (results == null || results.Count == 0)
{
_logger.LogInformation("Api-Token not found in database. Access denied. Customer: {0} | Token: {1}", customer.ToString(), token.ToString());
context.Result = new BadRequestObjectResult("Access Denied. Invalid Token");
return;
}
if (!context.ModelState.IsValid)
{
_logger.LogInformation("Model is in-valid.");
context.Result = new BadRequestObjectResult(context.ModelState);
}
_logger.LogInformation("Api-Token is valid.");
return;
}
}
}
您可以使用Configuration
class 中的GetSection
方法來獲取連接字符串
啟動.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddDbContext<ModelContext>(options => {
options.UseOracle(Configuration.GetSection("ConnectionStrings")["DbConnection"]);
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.