Question

I'm build my webapi project based on this article: A simple POC using ASP.NET Web API, Entity Framework, Autofac, Cross Domain Support

However, I need to pass a connection string to the DbContext because a user that connects to the webapi can select a different database to work with.

Where and what is that best way to implement this? In the controller, having a separate 'service' or a singleton?

Was it helpful?

Solution

I'm currently building a website that requires multiple databases also. This is the basics (for now). It may not be the best/efficient way, but it does the job so that I can continue working on the site.

Let's say you have this connection and everything there is correct, except the database name can change.

<add name="MyDbContext" connectionString="Server=SomeConnection;Database=SomeDatabase;"providerName="System.Data.SqlClient" /> 

You can create a connection string on the fly with this

public MyDbContext CreateDbContext(string databaseName)
{
    SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder(System.Configuration.ConfigurationManager.ConnectionStrings["MyDbContext"].ConnectionString);  // Gets the default connection
    sqlBuilder.InitialCatalog = databaseName;  // Update the database name

    return new MyDbContext(sqlBuilder.ToString());
}

Also, unless you want to automatically create a database if it doesn't exist, possibly from incorrect database name, you need to set the initializer. Simply pass the initializer null to prevent ef from automatically creating one. I set this in the constructor of MyDbContext

public class MyDbContext : DbContext
{
    /* some other constructors */

    public MyDbContext(string nameOrConnectionString, bool createDb)
        : base(nameOrConnectionString)
    {
        if(!createdDb)
        {
            System.Data.Entity.Database.SetInitializer<MyDbContext>(null);
        }
    }
}

OTHER TIPS

One way would be to have multiple ConnectionStrings in your web config. You could then select which ConnectionString to use depending on a parameter passed to your webapi:

In your web config:

  <connectionStrings>
<add name="dataBase1" connectionString="/*db info here*/" providerName="System.Data.SqlClient" />

<add name="dataBase2" connectionString="/*db info here*/" providerName="System.Data.SqlClient" />
</connectionStrings>    

Then in your code:

public someobject GetData(/*arguments*/, string dbType)
{
    var connectionString = dbType == 'dataBase1'  
    ? ConfigurationManager.ConnectionString['dataBase1'].toString() 
    : ConfigurationManager.ConnectionString['dataBase2'].toString()

    /*then pass connectionString to dbContext*/
    var dbContext = new DbContext(connectionString);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top