从appsettings.json到Entity Framework .NET Core的OnConfiguring方法的连接字符串

3

据我所见,我无法从此方法访问注入的IConfiguration对象。而且,据我所知,没有办法访问HttpContext并从中获取。有没有简单的方法可以获取存储在appsettings.json中的连接字符串?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Projekt.Models;

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Http;

namespace Project.DAL
{
    public class UserContext : DbContext
    {
        
        public DbSet<User> Users {get;set;}


        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            string connection_string = ""; //connection string from appsettings.json
            optionsBuilder.UseSqlServer(connection_string);
        }
            
        public class User {
            public string login{ get; set; }
            public string password { get; set; }

            
        }
    }
}
3个回答

3

您需要将IConfiguration注入到Startup构造函数中:

public class Startup
{
    public IConfiguration Configuration { get; }
    public IWebHostEnvironment Environment { get; }

    public Startup(IConfiguration configuration, IWebHostEnvironment environment)
    {
        Configuration = configuration;
        Environment = environment;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.ConfigureDatabase(Configuration);
       
        // ...other services
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
       // ...middlewares
    }
}

请注意,我使用扩展方法来配置我的dbContext,这使得启动代码更加简洁。
public static class ServiceExtensions
{
    public static void ConfigureDatabase(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddDbContext<MyDbContext>(options =>
        {
            string connectionString = configuration.GetConnectionString("sqlConnection") + ";password=" + configuration["Passwords:Database"];
            options.UseSqlServer(connectionString);
        });
    }
}

2

首先,您需要在appsettings.json中设置连接字符串。

"ConnectionStrings": {
"sqlConnection": "server=\\SQLEXPRESS; database=AKKADatabase; Integrated Security=true"

在你的startup.cs中,你需要配置你的连接

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

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationContext>(option => option.UseSqlServer(Configuration.GetConnectionString("sqlConnection")));
        services.AddControllersWithViews();
    }

然后您可以在数据库上下文中使用它:

   public class ApplicationContext : DbContext
{
    public ApplicationContext(DbContextOptions options)
        : base(options)
    {
    }

}


1
据我所知,您可以在任何地方注入IConfiguration:
    private readonly IConfiguration _configuration;

    public MyClass(IConfiguration configuration)
    {
        _configuration = configuration;
    }

但在Startup.ConfigureServices中这样做也没有问题:

 string connection = _configuration.GetConnectionString("Main");
 services.AddDbContext<UserContext >(options => options.UseSqlServer(connection));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接