Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setup Entity Framework For Dynamic Connection String

Tags:

I am working on an app that will use the same database schema across multiple databases. For this reason, I've created a database called MyTemplate. When a new user is created, they will have their own instance of the database. So, a database called something like MyTemplate_[UserName] will be created. When a user logs in, I need to point their queries to their database. For this reason, I know that I need to set the connection string at runtime. My problem is, I also want to use the Entity Framework.

Currently, I created a new .edmx using MyTemplate as the source. I thought I would be able to update the code and set the connection string there. Unfortunately, I can't figure out how to set it. The constructor to TemplateEntities does not have an overload that allows me to pass in a connection string. I noticed that TemplateEntities derived from DbContext, I don't think this would be the problem.

string connectionString = GetUsersConnectionString(); using (TemplateEntities entities = new TemplateEntities()) {   TemplateEntity entity = new TemplateEntity();    // Save to the database   entities.TemplateEntity.Add(entity);   entities.SaveChanges(); } 

Am I creating the .edmx incorrectly? Or am I missing something entirely? Everything I Google shows an overload that should allow a connection string passed in. However, I don't have that overload available.

like image 330
user70192 Avatar asked Jan 21 '13 14:01

user70192


People also ask

How does Entity Framework manage connections?

Entity Framework manages a connection pool, which means that EF will reuse connections when possible and only create new ones when it needs to. Whether or not each call creates a new connection depends on many factors. So it's hard to say whether any given set of calls will or will not create new connections.


1 Answers

The generated TemplateEntities class is marked as partial.

All you have to do is add another file with another part of the partial class definition that exposes the constructor you want to use:

partial class TemplateEntities {   public TemplateEntities( string nameOrConnectionString )     : base( nameOrConnectionString )   {   } } 

Then pass your connection string in to this constructor.

You want to put this code in a different file so it doesn't get over-written when you update your edmx model.

like image 104
Nick Butler Avatar answered Sep 20 '22 15:09

Nick Butler