2013-01-21 80 views
17

我正在研究將跨多個數據庫使用相同數據庫模式的應用程序。出於這個原因,我創建了一個名爲MyTemplate的數據庫。當創建新用戶時,他們將擁有自己的數據庫實例。因此,將創建一個名爲MyTemplate_[UserName]的數據庫。當用戶登錄時,我需要將他們的查詢指向他們的數據庫。出於這個原因,我知道我需要在運行時設置連接字符串。我的問題是,我也想使用實體框架。動態連接字符串的安裝實體框架

目前,我使用MyTemplate作爲源創建了一個新的.edmx。我想我可以更新代碼並在那裏設置連接字符串。不幸的是,我無法弄清楚如何設置它。 TemplateEntities的構造函數沒有允許我傳入連接字符串的重載。我注意到從DbContext派生的TemplateEntities,我不認爲這會是問題。

string connectionString = GetUsersConnectionString(); 
using (TemplateEntities entities = new TemplateEntities()) 
{ 
    TemplateEntity entity = new TemplateEntity(); 

    // Save to the database 
    entities.TemplateEntity.Add(entity); 
    entities.SaveChanges(); 
} 

我是不是錯誤地創建了.edmx?或者我完全錯過了一些東西?我的Google所有內容都顯示了一個允許傳入連接字符串的重載。但是,我沒有可用的重載。

回答

30

生成TemplateEntities類被標記爲partial

所有你需要做的就是添加一個文件與部分類定義暴露你要使用的構造函數的另一部分:

partial class TemplateEntities 
{ 
    public TemplateEntities(string nameOrConnectionString) 
    : base(nameOrConnectionString) 
    { 
    } 
} 

然後通過你的連接字符串中此構造函數。

你想把這個代碼在不同的文件,所以當你更新你的EDMX模型它不會覆蓋。

+2

當我這樣做,我收到一個錯誤,指出:「對象」不包含一個構造函數1個參數。我究竟做錯了什麼? – user70192

+3

帶有新構造函數的部分類定義必須與生成的類位於同一個命名空間中 - 否則它將聲明一個新類(默認情況下,該對象來自'object') –

+0

+1:我對此類構造函數爲何感到困惑不在默認模板中,但這是一個不錯的和乾淨的解決方案,thx。 – reSPAWNed

13

尼古拉斯巴特勒的回答非常正確。除了他所說的之外,我還面臨着爲實體框架採用現有連接字符串並將其指向具有相同結構的不同數據庫的問題。我用下面的代碼只改變現有的字符串的數據源:

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString; 
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString); 
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString) 
{ 
    DataSource = "newDBHost" 
}; 
var providerConnectionString = sqlCsBuilder.ToString(); 
ecsBuilder.ProviderConnectionString = providerConnectionString; 

string contextConnectionString = ecsBuilder.ToString(); 
using (var db = new SMSContext(contextConnectionString)) 
{ 
    ... 
} 
+0

這個類是'EntityConnectionStringBuilder&SqlConnectionStringBuilder'的dotnet內置類還是由你寫的? –

+0

@MonojitSarkar他們是.NET類,不是我寫的。這是它的美麗。 :-) –

相關問題