【ASP.net MVC|ADO.net】EF4.3 動態連接資料庫

【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去實作,之後有機會再做個紀錄吧!

 


 

大家好我是饅頭,希望大家喜歡我的文章

如果有錯誤的地方請不吝指教 ^_^