C# Tips

Today's C# Tip

EF Core 3 Use appsettings.json instead of hardcoded connection string

Question

How do I avoid hardcoded connection string in my DbContext class?

using Microsoft.EntityFrameworkCore;

public class TestDbContext : DbContext
{
  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    // hardcoded
    optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=TestDb;Integrated Security=True;");
  }

  //...
}

Tip

In .NET Core application, especially non-Web application such Console App or Desktop UI App, connection string can either be passed to DbContext constructor (TestDbContext constructor in the example) or use .NET Core Configuration API (ConfigurationBuilder). If you are going to use EF migration, the latter seems to be a good choice. Passing connection string to DbContext constructor is not enough for EF migration.

Answer

ConfigurationBuilder in .NET Core is used to build various configuration settings such as .JSON settings, .ini files, environment variables, etc. We can add connection string to appsettings.json file and read the file by using ConfigurationBuilder. To use AddJsonFile, you will need to install Microsoft.Extensions.Configuration.Json through Nuget Package Manager. Here is the code snippet.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace ConsoleApp1
{
    public class TestDbContext : DbContext
    { 
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // Get ConnectionString from appsettings.json
            IConfigurationRoot config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json")
                .Build();

            optionsBuilder.UseSqlServer(config.GetConnectionString("TestDb"));
        }

        public DbSet<Person> People { get; set; }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

And here is the sample connection string in appsettings.json.

{
  "ConnectionStrings": {
    "TestDb": "Data Source=.;Initial Catalog=TestDb;Integrated Security=True"
  }
}

One thing to remember is that we are loading appsettings.json from current directory (for example, bin\Debug or bin\Release). So don't forget to copy the file to output directory. To do so, here is what you need to set.



Related articles: