Connection string from appsettings.json to OnConfiguring method in Entity Framework .NET Core

Viewed 2070

As I can see, I cannot access from this method IConfiguration injected object. Also, there's no way to, as I can see, access HttpContext and get in from there. Is there any simple way how can I get the connections string stored in 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 Answers

As far as I know you can inject IConfiguration wherever you want:

    private readonly IConfiguration _configuration;

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

But there is nothing wrong with doing it in Startup.ConfigureServices:

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

You have to inject IConfiguration into Startup constructor:

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
    }
}

Note that I have used an extension method to configure my dbContext, this makes Startup cleaner:

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);
        });
    }
}

First you have to setup your connection string in appsettings.json

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

},

And your startup.cs you have to configure your connection

    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();
    }

} and after you can use it in your db context:

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

}

Related