Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Single Connection String with Multiple Entity Framework Models?

At work we currently have a very large web application with a connection to a massive database. We have been using Entity Framework for a while now and to make things easier we divided the database into many Entity models. This works well for us but we ran into an issue. Each EF model needs its own connection string due to the metadata part of the connection string. Managing so many connection string is a pain.

Now I have a solution that I think will work. I am going to create a class that will have the metadata info saved as a property also concatenated to the standard connection string in the web.config. So when we use the connection string "Database.EntityConnectionString" it will give me the Entity Connection string but we only have to manage a single connection string in the web.config. We will still have to manage the class with the metadata but Models don't change very much and we don't create them often so maintenance should be fine. My question, is there a better way of dealing with this issue or how would you do it?

Thanks!

like image 766
Lukasz Avatar asked Jun 25 '10 13:06

Lukasz


2 Answers

This is how I have implemented my solution to this problem:

namespace DBLibrary
{
    public enum Models
    {
        Model1,
        Model2    
    }

    public static class Database
    {
        public static string EntitiesConnectionString(Models model)
        {
            SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Default"].ConnectionString);

            builder["MultipleActiveResultSets"] = true;
            builder["Connect Timeout"] = 30;

            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.ProviderConnectionString = builder.ConnectionString;

            switch (model)
            {
                case Models.Model1:
                    entityBuilder.Metadata = "res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl";
                    return entityBuilder.ToString();
                case Models.Model2:
                    entityBuilder.Metadata = "res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl";
                    return entityBuilder.ToString();
                default:
                    throw new Exception("Invalid model, no connection string defined");
            }
        }
    }
}

I still need to clean up the code and all but I think this give you a good idea on how this can be implemented. I would still be very interested if there are different and better ways of doing this.

Thanks!

like image 188
Lukasz Avatar answered Oct 14 '22 13:10

Lukasz


Add Default Construction in your Class

public class ItemContext : DbContext
{
    public DbSet<Item>Items get; set; }
    public DbSet<ItemDetail> ItemDetails { get; set; }

    public ItemContext ()
    {

        this.Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
    }
}
like image 42
Muntaqim Umatiya Avatar answered Oct 14 '22 12:10

Muntaqim Umatiya