2011-09-30 94 views
2

如果我有一個dbContext誰的連接字符串是在上下文創建過程中創建的,然後我想根據一些信息來映射表名......如何將該數據傳遞給表映射?例如:動態DbContext映射表

private object createContext(string name, string country) 
{ 
    DbConnectionstringbuilder conn = new DbConnectionstringbuilder(); 
    conn.Add("Provider", "System.Data.SqlClient"); 
    conn.ConnectionString = string.Format(name, "dbName_" + country + "_moreName"); 
    //maybe an if/else since we will say there are more names and countries 
    return new object(conn.ToString()); 
} 

現在,當你初始化的DbContext是這樣的:

public class object : DbContext 
{ 
    public object(string conn):base(conn) 
    { 
     DbDatabase.SetInitializer<object>(null); 
    } 
//insert dbset and mapping config calls here 
} 

現在我想我的表映射到喜歡 「table_」 +國+ 「_endtablename」;我猜如何將數據傳遞給映射調用?

這些表映射到使用此格式的現有數據庫。該國實際上來自登錄用戶的憑據,因此基於位置等。我只需要找到一種方法來訪問該國家代碼,該代碼是後者創建的dbcontext中的基類的內部構造函數。

回答

0

嗯......我會在你的DbContext類上做一個工廠方法,然後爲你希望支持的每個國家實現派生的DbContext類。這將使您能夠爲每個國家/地區自定義數據庫初始值設定項。由於所有派生的具體DbContext使用相同的抽象父對象,因此可以將它們作爲父對象並使用它們。在初始化程序中,您可以使用流暢的映射來設置數據庫名稱並映射所需的表名。 EF Code First的優點在於,它允許您使用標準的OO模式(如工廠方法)來解決您所描述的問題。

但是,我不得不說,你可能想重新考慮你的表命名方案。你發現這很難的原因是因爲它有點不尋常的設置。最終用戶通常不會直接針對數據庫中的表進行查詢,因爲執行業務規則太困難了。除非有技術原因,否則您需要每個數據庫中的表具有國家/地區代碼的名稱,否則我會讓技術推動您的表格命名方案,並讓您的客戶推動最終用戶體驗。我認爲國家編碼的數據庫名稱是足夠的。這實現了數據分離,但使得編碼變得更加簡單,並且使得爲一個數據庫編寫的查詢在其他數據庫上工作。

+0

馬克感謝您的迴應。我將考慮工廠方法,但是這又必須根據用戶訪問數據來切換。國家代碼基本上來自其憑據。話雖如此,數據庫已經存在,因此我不得不將它們映射爲數據庫已經結構化......長話短說,儘管我同意命名,但它的目的也是這樣。 – MKunstman