Connecting to database for Multi-Tenant application?
Asked Answered
L

1

1

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

Lyford answered 22/9, 2015 at 13:11 Comment(1)
As written, your question is opinion-based and broad: off topic for Stack Overflow. Can you narrow it to a specific technique that you don't know how to do?Studner
B
2

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.
Ballottement answered 22/9, 2015 at 14:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.