C#在运行时更改自定义连接字符串

时间:2014-12-09 12:26:20

标签: c# winforms entity-framework-5 connection-string

EF上的新内容。我正在创建用户从计算机中选择数据库的应用程序。现在我想更改连接字符串以匹配数据库的位置,例如:这是指向磁盘上某处的数据库位置的当前连接字符串(C:\ Users \ student \ Documents \ TestData.md):

add name="test" connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDB)\v11.0;attachdbfilename="C:\Users\student\Documents\TestData.mdf";integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />

现在当用户从磁盘中选择新数据库时,连接sting需要更改为新数据库所在的位置(C:\ Users \ student \ Desktop \ NewSelectedDatabase.mdf):

add name="test" connectionString="metadata=res://*/Model2.csdl|res://*/Model2.ssdl|res://*/Model2.msl;provider=System.Data.SqlClient;provider connection string='data source=(LocalDB)\v11.0;attachdbfilename="C:\Users\student\Desktop\NewSelectedDatabase.mdf";integrated security=True;connect timeout=30;MultipleActiveResultSets=True;App=EntityFramework'" providerName="System.Data.EntityClient" />

现在我已经创建了filedialog,因此用户可以选择数据库并获取其地址。我还将我的edmax更改为recive自定义连接字符串:

    public partial class Tester : DbContext
{
    public Tester()
        : base("name=Test")
    {
    }

    public Tester(string customcs)
        : base(customcs)
    {

    }

现在我的问题是我将构造函数作为自定义连接字符串传递给我的是什么?我希望你理解我,因为我真的很擅长英语和解释事情

1 个答案:

答案 0 :(得分:1)

当你拥有EF设计器时,在属性窗口中是一个连接字符串设置。根据需要设置所有内容后,将该设置清除为无。它重写生成的代码以接受在实例化时传入的连接字符串。

var mything= new dbcontext (connstring)

另一个选择是创建一个新的类(.cs)文件,为它提供与Tester EF上下文所属的相同的命名空间,并将其粘贴到那里:

public partial class Tester : DbContext {
    public Tester(string _connectionString) : base(ConnectionString(_connectionString)) {
        this.Configuration.ProxyCreationEnabled = false;
        this.Configuration.AutoDetectChangesEnabled = false;
    }
    private static string ConnectionString(string _connectionString) {
        EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
        entityBuilder.ProviderConnectionString = _connectionString;
        entityBuilder.Metadata = "res://*/Models.Tester.csdl|res://*/Models.Tester.ssdl|res://*/Models.Tester.msl";
        entityBuilder.Provider = "System.Data.SqlClient";
        return entityBuilder.ToString();
    }   
}

注意它是一个部分类(就像Tester的自动生成类一样) - 所以你要添加到由EF制作的自动生成的类中(再次,确保它们&#39) ;在相同的命名空间中,所以它实际上是对部分类的补充,而不仅仅是你创建自己的小类)。

这样,您就可以添加一个新的构造实例(即传递连接字符串),该实例将被修改为正确的实体连接字符串构建器(通过私有静态ConnectionString方法)。

var myThing = new Tester(ConfigurationManager.ConnectionStrings["db_DBName"].ToString());

我在web.config中有一行连接:

<add name="db_DBName" connectionString="Data Source=DBSERVER;initial Catalog=DBNAME;" providerName="System.Data.SqlClient" />

构建目标定义了它的转换,我只是一直将相同的字符串传递给代码。