2014-12-09 46 views
0

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

回答

1

當你有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

相關問題