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

问题描述:

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

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" /> 

现在,当用户选择从磁盘连接刺痛需要更改到新数据库所在位置新的数据库(C:\用户\学生\桌面\ 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) 
    { 

    } 

我现在的问题是我该通过什么来构造定制的连接字符串?我希望你理解我,因为我的英语和explainig事情

+1

检查[这](http://www.c-sharpcorner.com/UploadFile/1a81c5/configuring-connection-string-in-app-config-file-during-runt/)链接。 – Kurubaran 2014-12-09 12:43:31

+0

找到了解决办法:我复制粘贴的我的旧的连接字符串strinng然后只是改变attachdbfilename到OPENFILE的对话位置然后传递到构造器感谢:d – user3764527 2014-12-09 13:31:47

+0

@ user3764527 - 我加入到我的回答如下,它提供了另一种更加动态的方式(使用部分类)。 – Jason 2014-12-10 16:29:07

当你有EF设计起来真的很不好,在属性窗口是ConnectionString的设置。一旦你把所有的东西都设置好了,清除该设置为无。它重写生成的代码以接受在实例化时传入的连接字符串。

var mything= new dbcontext (connstring)

另一种选择是只创建一个新的类(的.cs)文件给它,你的计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生成的自动生成的类中(再次确保它们在相同的命名空间中,所以它真的是部分课程的补充,而不仅仅是让你自己创建一个小课堂)。

通过这种方式,您将添加一个新的构造实例(即传递连接字符串),将其修改为正确的实体连接字符串构建器(通过私有静态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" /> 

构建目标定义其transformantion,我只是通过相同的字符串到代码中所有的时间。

+0

不错:D,var mything = new dbcontext(connstring)很不错,但是这给了我更多的选择。这是如何通过使用代码第一个模型? – user3764527 2014-12-10 17:46:24

+0

也许,可能?我还没有解决一个代码优先方法,每一个我已经做到了,我脚手架掉现有的数据库(DB首先,设计师)的时间。我记得当我需要定位Oracle数据库并使用它们的托管驱动程序时,我想到了第二个选项。 – Jason 2014-12-10 17:48:34