具有多个实体框架模型的单个连接字符串?

时间:2010-06-25 13:22:41

标签: entity-framework web-config connection-string

在工作中,我们目前有一个非常大的Web应用程序,它连接到一个大型数据库。我们一直在使用Entity Framework一段时间,为了简化操作,我们将数据库划分为许多实体模型。这对我们很有用,但我们遇到了一个问题。由于连接字符串的元数据部分,每个EF模型都需要自己的连接字符串。管理这么多连接字符串是一件痛苦的事。

现在我有一个我认为可行的解决方案。我将创建一个类,它将元数据信息保存为属性,也连接到web.config中的标准连接字符串。因此,当我们使用连接字符串“Database.EntityConnectionString”时,它将为我提供实体连接字符串,但我们只需要管理web.config中的单个连接字符串。我们仍然需要使用元数据来管理类,但模型不会发生太大变化,我们不会经常创建它们,因此维护应该没问题。我的问题是,有没有更好的方法来处理这个问题,或者你会怎么做?

谢谢!

3 个答案:

答案 0 :(得分:7)

这是我实现此问题的解决方案的方法:

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");
            }
        }
    }
}

我仍然需要清理代码,但我认为这可以让您对如何实现这些代码有所了解。如果有不同的更好的方法,我仍然会非常感兴趣。

谢谢!

答案 1 :(得分:1)

在班级中添加默认构造

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;
    }
}

答案 2 :(得分:0)

我遇到了同样的问题。我通过以下方式解决了这个问题:

我创建了两个edmx文件,但是在创建第二个edmx文件时,我忽略了要在配置文件中保存的连接字符串。这样我的配置文件将只保存一个连接字符串。 然后我修改了我的连接字符串中的以下行:

<add name="MyDbContext" connectionString="metadata=res://*/;provider=System.Data.SqlClient;provider connection string=&quot;data source=abc;initial catalog=mydb;persist security info=True;user id=myuser;password=password;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

只需将“res://model1.csdl”替换为“res:// * /”,它就像魅力一样。

您可以在dbcontext类的构造函数中指定此连接名称,如:

public MyDbContext() : base("name=NameOfYourConnectionString") //  Name of your connection string
{ }

注意:我正在使用Entity Framework 5.0。