Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using entity framework on multiple databases

I am writing a payroll system that will integrate with a pre-existing system. The original system had a master database that handled user management and some global configuration, below that there are multiple databases each identical in structure, basically each database is one companies payroll database, all these are tied to the main database because it belongs to a parent company who has many subsidiaries each with their own HR department.

What I was wondering is if there is any way that I can, based on either a cookie or another method that stores what company they wish to connect to, dynamically change the entity frameworks target database based on their input using a filter?

Here's an example:

User A logs in to the site, page loads with available companies that the user has permission to access, user will then select a company, they have admin privileges in that company, they add an employee, before that action is run, asp.net will switch the connection string to the appropriate database then add the record.

like image 467
clifford.duke Avatar asked Jul 30 '13 07:07

clifford.duke


People also ask

Can we use multiple database in Entity Framework?

Multiple DbContext was first introduced in Entity Framework 6.0. Multiple context classes may belong to a single database or two different databases.

Can you have two DB contexts?

You can have multiple contexts for single database. It can be useful for example if your database contains multiple database schemas and you want to handle each of them as separate self contained area.


2 Answers

It is very simple. I have:

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in     web.config also the name of Entitiframework { } 

already in autogenerated Model.Context.cs of edmx folder

To connect to multiple database in runtime, I created another constructor that takes connection string as parameter like below in same file Model.Context.cs

public WMSEntities(string connStringName)     : base("name=" + connStringName) { } 

Now I added other connection string in Web.Config for example

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/>  <add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/> 

Then, when connecting to database I call below method passing connetionString name as parameter

public static List<v_POVendor> GetPOVendorList(string connectionStringName) {     using (WMSEntities db = new WMSEntities(connectionStringName))     {                        vendorList = db.v_POVendor.ToList();                      } } 
like image 72
Sakhu Avatar answered Sep 19 '22 15:09

Sakhu


EF6 has better support for multiple DB access from Same context. Here is a snippet from EF5. Managing the database initializer setting prior is important. You may not want to trigger ANY migrations. i.e, use this before

Database.SetInitializer(new ContextInitializerNone<MyDbContext>());

but to answer the question: Yes you can

var conn = GetSqlConn4DbName(dataSource,dbName ); var ctx = new MyDbContext(conn,true);    public DbConnection GetSqlConn4DbName(string dataSource, string dbName) {         var sqlConnStringBuilder = new SqlConnectionStringBuilder();         sqlConnStringBuilder.DataSource = String.IsNullOrEmpty(dataSource) ? DefaultDataSource : dataSource;         sqlConnStringBuilder.IntegratedSecurity = true;         sqlConnStringBuilder.MultipleActiveResultSets = true;          var sqlConnFact = new SqlConnectionFactory(sqlConnStringBuilder.ConnectionString);         var sqlConn = sqlConnFact.CreateConnection(dbName);         return sqlConn;     }    public class ContextInitializerNone<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext {     public void InitializeDatabase(TContext context) {  } } 

Also see StackOverflow answer using migration, sample code, and dynamic db connection

like image 31
phil soady Avatar answered Sep 21 '22 15:09

phil soady