Connecting to database for Multi-Tenant application?

I am in the process of creating a Multi-Tenant asp.net application.

I am deciding between separate MSSQL databases or schemas.

However, I cannot find any information on how I can change the database (ideally) or user account dynamically, depending on which one the user should connect to.

I will most likely have a Base Table which defines which database the user should connect to.

Doing this using Linq to SQL is easy but I am not using Linq everywhere because the tables are quite dynamic and the schema is like to change very often.

What is the best method of doing this? I am happy to look at using Schemas, but I don’t want it to become very messy but I would also need to do a similar approach but somehow impersonate that user in the same way to pickup a default schema.

I know you can dynamically change the web.config connection string but I have tried that and it physically changes the file contents which also refreshes the app pool and causes me lots of other issues.

Thanks

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

If you have set up multiple database for multiple tenants, you can create connection string based on the tenant.

You can simply add an overload to your db context constructor that accepts connection string as input:

public partial class SampleDbEntities
{
    public SampleDbEntities(string connectionString)
        : base(connectionString)
    {
    }
}

Then wherever you need to create an instance of your db context, use this overload and inject suitable username and password in the connection string based on your tenant detection strategy.

For example when your connection string looks like this:

var connectionTemplate =
    @"metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" +
    @"provider=System.Data.SqlClient;" +
    @"provider connection string=""data source={0};" +
    @"initial catalog={1};" +
    @"persist security info=True;" +
    @"user id={2};" +
    @"password={3};" +  
    @"MultipleActiveResultSets=True;App=EntityFramework""";

string connection = string.Format(connectionTemplate, 
    @"(localdb)v11.0", @"TestDB", @"user1" , @"password1");

var db = new SampleDbEntities(connection);

Note:

  • Create connection string template based on the connection string which is in your web.config.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x