Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF 6中的运行时更改连接字符串_C#_Entity Framework_Database Connection_Connection String - Fatal编程技术网

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

C# 在EF 6中的运行时更改连接字符串,c#,entity-framework,database-connection,connection-string,C#,Entity Framework,Database Connection,Connection String,我主要使用dbcontext和以下语句: using (var context = new MyContext()) { } using (var context = new MyContext(DbAccessor.ConnectionStringForContext) {} 但后来我不得不添加一个带有更改数据库功能的项目。我发现我可以将dbcontext构造函数更改为: public MyContext(string connectionstring) : base(c

我主要使用dbcontext和以下语句:

using (var context = new MyContext())
{
}
using (var context = new MyContext(DbAccessor.ConnectionStringForContext) 
{}
但后来我不得不添加一个带有更改数据库功能的项目。我发现我可以将dbcontext构造函数更改为:

public MyContext(string connectionstring)
        : base(connectionstring)
{
}
我为connectionstring创建了一个具有属性的类:

public static class DbAccessor
{
    public static string ConnectionStringForContext { get; set; }
}
我在开头设置了这个属性,我的using语句如下所示:

using (var context = new MyContext())
{
}
using (var context = new MyContext(DbAccessor.ConnectionStringForContext) 
{}
它可以工作,但是我的连接字符串现在到处都是,我觉得我不应该用连接字符串来做这件事。有更好的方法吗?如果要更改连接字符串,处理它们的最佳方法是什么?我应该停止使用这些using语句吗

我看到了这个问题:


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

您有一个连接字符串的位置,这没关系。 如果要更改连接字符串,只需更改
DbAccessor.ConnectionStringForContext
,这很好。
或者,如果您不想在constructor中使用param,您可以尝试使用此解决方案。

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

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

    public static MyContext Create()
    {
        return new MyContext(DbAccessor.ConnectionStringForContext);
    }
}
然后,您可以这样创建您的上下文:

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

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

可能重复的谢谢!现在我只需要做一次。这就是我想要的:D