CindyH
CindyH

Reputation: 3026

How can I add a dbContext after Startup in .Net Core?

I am using .Net Core, using the built-in dependency injection. In my login screen, I need the user to also choose a departmental database - we have different databases with the same structure to use the same application with different data. However, I can't figure out how to add/modify the dbContext that late. Startup.cs has the DI, but I don't know which connection string to read from the config until the user has chosen the department. It is a small database, and the company is not concerned about the management of the duplicate databases.

How can I add the service late

services.AddDbContext<my_accountingContext>(options =>
options.UseMySQL(Configuration.GetConnectionString("CorrectDepartmentConfig")));

when I actually know what CorrectDepartmentConfig is?

Or, if that can't be done, how can I do a smelly change of the my_accountingContext after Startup.cs?

Upvotes: 1

Views: 3662

Answers (2)

leandro.andrioli
leandro.andrioli

Reputation: 1047

You can use an implementation factory overload of IServiceCollection in ConfigureServices method form Startup class:

//First register a custom made db context provider
services.AddTransient<ApplicationDbContextFactory>();
//Then use implementation factory to get the one you need
services.AddTransient(provider => provider.GetService<ApplicationDbContextFactory>().CreateApplicationDbContext());

The implementation of CreateApplicationDbContext depends on your specific needs, but a base implementation should look like the following:

public ApplicationDbContext CreateApplicationDbContext(){
  //TODO Something clever to create correct ApplicationDbContext with ConnectionString you need.
} 

After this implementation, you can inject the correct ApplicationDbContext in your controller, action...

public MyController(ApplicationDbContext dbContext)
{
    _dbContext = dbContext;
}

public IActionResult([FromServices] ApplicationDbContext dbContext){
}

Upvotes: 2

Ricardo Peres
Ricardo Peres

Reputation: 14555

You can always set the connection string from inside the protected OnConfiguring method. You can get access to the IConfiguration instance from there (the DbContext class has a service locator, Instance property), retrieve the connection string, and then call UseMySql extension method with the appropriate connection.

Something like this:

protected virtual void OnConfiguring(DbContextOptionsBuilder builder)
{
    var configuration = (this as IInfrastructure<IServiceProvider>).GetService<IConfiguration>();
    var connectionString = configuration.GetConnectionString("<name>");
    builder.UseMySql(connectionString);
    base.OnConfiguring(builder);
}

For the strongly-typed version of GetService do not forget to reference namespace Microsoft.Extensions.DependencyInjection.

Upvotes: 0

Related Questions