Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connecting and Databse Migration for Entity Framework Core using Key Vault and Package Manager Console

I changed my appSettings.config to no longer have connection strings as they are now all in Azure Key Vault. I was able to connect no problem, but now when I try to create the db using EF code first migrations in a new azure db using

add-migration InitialCreate

Value cannot be null.
Parameter name: connectionString

I am getting the error:

        public Startup(IHostingEnvironment env)
    {
        AutomapperConfiguration.Configure();
        _hostingEnvironment = env;
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", false, true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
            .AddEnvironmentVariables();

        if (env.EnvironmentName == Constant.EnvironmentName_QA || env.EnvironmentName == Constant.EnvironmentName_Staging || env.EnvironmentName == Constant.EnvironmentName_Production)
            env.ConfigureNLog($"nlog.{env.EnvironmentName}.config");
        else
            env.ConfigureNLog($"nlog.config");


        builder.AddAzureKeyVault(Configuration["AzureVault:Vault"], Configuration["AzureVault:ClientId"], Configuration["AzureVault:ClientSecret"]);

        Configuration = builder.Build();

      }




Configuration(){
.
.
.
services.AddDbContext<SafeContext>(options => options.UseSqlServer(Configuration[Configuration["AzureVaultKeys:DBConnectionString"]]));
.
.
.
}
like image 480
Anil Avatar asked Dec 06 '25 05:12

Anil


1 Answers

According to my test, we can use the following steps to implement migrations

  1. Install SDk
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.2" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.2" />
  1. Code

    a. Program.cs

     public static void Main(string[] args)
       {
    
           var host = CreateHostBuilder(args).Build();
    
           using (var scope = host.Services.CreateScope())
           {
               var services = scope.ServiceProvider;
               try
               {
                   var context = services.GetRequiredService<SchoolContext>();
                   DbInitializer.Initialize(context);
               }
               catch (Exception ex)
               {
                   var logger = services.GetRequiredService<ILogger<Program>>();
                   logger.LogError(ex, "An error occurred while seeding the database.");
               }
           }
    
           host.Run();
       }
    
       public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
       .ConfigureAppConfiguration((context, config) =>
       {
    
           config.SetBasePath(context.HostingEnvironment.ContentRootPath)
                  .AddJsonFile("appsettings.json", false, true)
                  .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", true)
                  .AddEnvironmentVariables();
           var builtConfig = config.Build();
           config.AddAzureKeyVault(
                       $"https://{builtConfig["KeyVault:Vault"]}.vault.azure.net/",
                       builtConfig["KeyVault:ClientId"],
                       builtConfig["KeyVault:ClientSecret"],
                       new DefaultKeyVaultSecretManager());
    
    
       })
       .ConfigureWebHostDefaults(webBuilder =>
       {
           webBuilder.UseStartup<Startup>();
       });
    

    b. Startup.cs

    public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<SchoolContext>(options =>
        options.UseSqlServer(Configuration["<your secret name>"])); //For example you secret name is ConnectionStrings--DefaultConnection, the code is  Configuration["ConnectionStrings:DefaultConnection"]  
            services.AddControllersWithViews();
        }
    

3 migrate

add-migration InitialCreate

enter image description here

For more details, please refer to

https://learn.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1

https://learn.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro?view=aspnetcore-3.1

like image 75
Jim Xu Avatar answered Dec 07 '25 20:12

Jim Xu