【ASP.net MVC|ADO.net】EF 4.3 動態連接資料庫
前言
有時候,我們會需要用到依照使用者不同,而連接不同的資料庫做處理
這裡我們利用EF 4.3裡面自動產生的多載方式去講解(ps.本文EF5以上無法使用)
事前準備
除了原本顯示資料的資料庫外,我們另外需要一個用來處理使用者登入的資料來源
並且在用戶端的cookie要存放資料庫代號
這一個資料庫我們會用到兩張資料表:
1.存放使用者的登入資料(DynamicEntities)
2.資料庫資料(DatabaseEntities)
資料庫設計範例如下
內文
一般要存取資料庫的時候,會先宣告一個實體物件出來,變成一個變數使我們可以輕鬆存取
private DatabaseEntitiesdb = new DatabaseEntities(); //宣告資料庫實體物件
但今天我們需要根據不同的使用者,去更改不同的資料庫,就會用到內部內涵的多載方式來做建
所以我們會在建構的時候,塞入我們要的連接字串
private DatabaseEntitiesdb = new DatabaseEntities(ConnectionString);
假如我們直接放置一個字串變數的話,他就會出現錯誤
所以我們要建立一個靜態的類別給他使用
public static String DBS
{
get
{
try
{
DynamicEntities DRS = new DynamicEntities();
FormsAuthenticationTicket ticket = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket;
return SQL_String(DRS.DB_List.Where(p => p.DB_NO.Equals(ticket.UserData)).FirstOrDefault());
}
catch
{
return "";
}
}
}
public static String SQL_String(DB_List List)
{
EntityConnectionStringBuilder ESCB = new EntityConnectionStringBuilder();
ESCB.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", "Models.Model1");
ESCB.Provider = "System.Data.SqlClient";
ESCB.ProviderConnectionString = String.Format("data source={0};initial catalog={1};user id={2};password={3};multipleactiveresultsets=True;App=EntityFramework"
, List.DB_SERVER, List.DB_NAME, List.DB_USER, List.DB_PASSWORD, List.DB_USER);
return ESCB.ConnectionString;
}
如此一來,我們在建立實體的時候就需要改成
private DatabaseEntitiesdb = new DatabaseEntities(DBInitialization.DBS);
這樣他就會根據我們放置在cookie裡面的資料庫代號,尋找出相對應的資料庫帳號密碼,組成連接字串了!
後記
這個方法是因為小的初學MVC,在網路上所找到的辦法後實做,之後其實有另一個更好的辦法是DAL(資料存取層)
而且若您已經將EF升級到5的版本後,就無法使用這樣的東西了,因為在EF5,已經沒有這個多載的建構函式了!
後續需要用到DAL去實作,之後有機會再做個紀錄吧!
大家好我是饅頭,希望大家喜歡我的文章
如果有錯誤的地方請不吝指教 ^_^