簡體   English   中英

.Net Core 3 / Entity Framework Core 將連接字符串放入 Appsettings.json 不起作用

[英].Net Core 3 / Entity Framework Core putting connection string in Appsettings.json not working

.NET Core 仍然是新手,但我正在嘗試將我的連接字符串放入Appsettings.json文件中。 我正在關注有關如何執行此操作的Microsoft 文檔,並且我認為我的所有設置都是正確的。

該項目將編譯並運行,但是當我點擊 API 時出現錯誤

沒有為此 DbContext 配置數據庫提供程序。

我使用了 EF Core 在我的上下文中放置的連接字符串,只是將其注釋掉,因此DbContextOnConfiguring中實際上沒有任何內容。 這是連接到 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM