【问题标题】:Change Connection String at Runtime in EF 6在 EF 6 运行时更改连接字符串
【发布时间】:2016-02-04 10:09:50
【问题描述】:

我主要将我的 dbcontext 与这样的语句一起使用:

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

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

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

我创建了一个带有连接字符串属性的类:

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

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

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

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

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

但不同的是,我有一个有效的解决方案,但我不想到处都有我的连接字符串。如果我在每个 using 语句中都使用了该扩展方法。这几乎就像我的解决方案一样,在每个 using 语句中只增加一行......

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!现在我只需要做一次。这就是我想要的:D
【解决方案2】:

如果我对您的理解正确,您需要能够支持您的应用程序连接到多个数据库。您可以照原样执行此操作,但在 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())
{
}

【讨论】:

    【解决方案3】:

    你有一个连接字符串的地方,没关系。 如果您想更改连接字符串,您只需更改DbAccessor.ConnectionStringForContext,这很好。 或者,如果您不希望在 contructor 中使用参数,您可以尝试来自 question 的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多