在EF 6中的运行时更改连接字符串

时间:2016-02-04 10:09:50

标签: c# entity-framework database-connection connection-string

我主要使用我的dbcontext使用这样的语句:

using (var context = new MyContext())
{
}

但后来我不得不添加一个带有更改数据库功能的项目。我发现我可以将dbcontext构造函数更改为:

public MyContext(string connectionstring)
        : base(connectionstring)
{
}

我创建了一个带有connectionstring属性的类:

public static class DbAccessor
{
    public static string ConnectionStringForContext { get; set; }
}

我在开头设置了这个属性,我的using语句如下所示:

using (var context = new MyContext(DbAccessor.ConnectionStringForContext) 
{}

它可以工作,但我的连接字符串现在无处不在,我觉得我不应该用连接字符串来做。有没有更好的方法呢?如果我想更改它们,处理我的连接字符串的最佳方法是什么?我应该停止使用这些使用语句吗?

我见过这个问题:Entity Framework change connection at runtime

但不同的是,我有一个正常运行的解决方案,但我不想在任何地方都有我的连接字符串。如果我在每个using语句中使用了该扩展方法。这几乎就像我的解决方案在每个使用声明中只有一行......

3 个答案:

答案 0 :(得分:2)

您可以在上下文中尝试使用连接字符串的静态工厂方法(或您喜欢的工厂类),如下所示:

public class MyContext : ...
{
    public MyContext(string connectionstring)
        : base(connectionstring)
    {
    }

    public static MyContext Create()
    {
        return new MyContext(DbAccessor.ConnectionStringForContext);
    }
}

然后您可以像这样创建上下文:

using (var context = MyContext.Create())
{
}

答案 1 :(得分:1)

如果我理解正确,您需要能够支持连接到多个数据库的应用程序。你可以这样做,但是在你的DBAccessor类中说两个属性,删除集合并从配置中获取相关连接,这样你的配置总是在应用程序配置中维护。

public static class DbAccessor
{
    public static string ConnectionStringForDBOne { get { return ConfigurationManager.ConnectionStrings["DBOne"].ConnectionString} }
    public static string ConnectionStringForDBTwo { get { return ConfigurationManager.ConnectionStrings["DBTwo"].ConnectionString} }
}

然后添加一些静态创建者以使生活更轻松:

public MyContext(string connectionstring)
        : base(connectionstring)
{
    public static MyContext CreateContextDBOne()
    {
        return new MyContext(DbAccessor.ConnectionStringForDBOne);
    }

    public static MyContext CreateContextDBTwo()
    {
        return new MyContext(DbAccessor.ConnectionStringForDBTwo);
    }
}

然后在代码中使用它们:

using (var context = MyContext.CreateContextDBOne())
{
}

using (var context = MyContext.CreateContextDBTwo())
{
}

答案 2 :(得分:0)

你有一个连接字符串的地方,没关系。 如果您想要更改连接字符串,则只更改DbAccessor.ConnectionStringForContext,这很好。 或者,如果您不想在构造函数中使用param,则可以尝试使用此question解决方案。