使用EF 4.1 / DbContext基于环境切换连接字符串

时间:2011-09-15 17:06:43

标签: entity-framework-4.1

我已经看过几篇关于此的帖子,但未能从回复中创建可用的解决方案。也许是由于缺乏了解。

提供的托管要求在登台和制作时使用相同的代码库,包括连接字符串。

如何切换DbContext的连接字符串?

我知道我可以这样做:

public FooEntities() : base("ApplicationServices") { }

但这不是动态的 - 它只是在运行时设置它。

那么我如何在运行时实际选择连接字符串?

2 个答案:

答案 0 :(得分:5)

public FooEntities() : base("ApplicationServices") { }

FooEntities继承自ObjectContext

你也可以写

public FooEntities() : base(YourStaticMethodToGetConnectionString()) { }

然后,您可以根据某些环境设置从web.config中提取连接字符串

答案 1 :(得分:0)

我现在正在审核这个问题,因为我将开发本地,然后部署到云端。因此,希望动态切换数据上下文使用的连接字符串。我的计划是在标准" connectionStrings"中配置所需的连接字符串。 Web.config的一部分,然后将逻辑放在DbContext构造函数中,如:

public partial class MyApplicationDbContext : DbContext
{
    public MyApplicationDbContext()
        : base("name=cloud")
    {
        Database.Connection.ConnectionString = 
            ConnectionStringHelpers.GetHostBasedConnectionString();
    }

    // abbreviated..
}

替代:

public partial class MyApplicationDbContext : DbContext
{
    public MyApplicationDbContext()
        : base(ConnectionStringHelpers.GetHostBasedConnectionString())
    {
    }

    // abbreviated..
}

助手:

public class ConnectionStringHelpers
{
    public static string GetHostBasedConnectionString()
    {
        return GetConnectionStringByName(GetHostBasedConnectiongStringName());
    }

    public static string GetHostBasedConnectiongStringName()
    {
        switch (System.Net.Dns.GetHostName())
        {
            case "myHostname": return "local";   // My local connection
            case "ip-ABCD123": return "cloud";   // Cloud PaaS connection
            default: return "cloud";
        }           
    }

    public static string GetConnectionStringByName(string name)
    {
        return ConfigurationManager.ConnectionStrings[name].ConnectionString;
    }
}

在我的Web.config文件中:

<connectionStrings>
    <add name="local" connectionString="..." providerName="System.Data.SqlClient" />
    <add name="cloud" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>