我的項目規範是使用實體框架的ASP.net MVC3應用程序。在Asp.net Mvc3應用程序中使用多個Web.config
問題是,客戶明智的數據庫將被創建。個人應用程序個人數據庫對我來說工作正常。
但我想一個單一的應用程序和多個數據庫應該與那個一起使用。
如何實現相同?
我的項目規範是使用實體框架的ASP.net MVC3應用程序。在Asp.net Mvc3應用程序中使用多個Web.config
問題是,客戶明智的數據庫將被創建。個人應用程序個人數據庫對我來說工作正常。
但我想一個單一的應用程序和多個數據庫應該與那個一起使用。
如何實現相同?
不需要使用默認構造函數和web.config驅動的連接字符串來創建實體連接,而是需要手動構建實體連接字符串,並使用其他構造函數之一將其構建到構建實例中。通常有一個需要一個字符串,另一個需要一個EntityConnection
實例。
如果唯一發生變化的就是數據庫的名稱,那麼你可能會拿走一個格式化字符串 - 你可能會在web.config中找到當前的那個 - 看起來像這樣:
metadata=res://*;provider=System.Data.SqlClient;provider connection string="Data Source=[server];Initial Catalog=[db];User ID=[user];Password=[password]"
注 - [server]
,[db]
,[user]
和[password]
這裏是佔位符。
並簡單地用{0}
替換[db]
。
然後 - 假設你可以從用戶獲得一個數據庫名稱可能會做這樣的事情如下:
public string BaseConnectionString {
get{
//TODO: Get base connection string - can just bake in the constant string with
//with the format placeholder. A better thing would be to add it as an
//AppSetting in web.config
}
}
//this now becomes you're primary way of getting a database connection for a user.
public MyEntities GetEntities(User user)
{
var eConnectionString = GetConnectionString(user);
return new MyEntities(eConnectionString);
}
public string GetConnectionString(User user)
{
var dbName = get_db_name_for_user(user);
return string.Format(BaseConnectionString, dbName);
}
這不過是實現這一目標的方法之一。在國際奧委會的環境下,可以隱藏所有這一切,只需簡單地撥打Resolve<>
即可。
謝謝安德拉斯唯一的問題仍然是當第二位客戶登錄第一位客戶時自動登出。如何處理該 –
嗯...聽起來像你使用'靜態'變量的地方,你不應該:) –
AFAIU,你不能與多個CONFIGS解決它,你需要到的ConnectionStrings存儲到一個單獨的分貝爲應選擇英寸 –
感謝名單Fruqan,而客戶登錄相應的連接我可以動態地寫在web.config中的連接字符串? –
是的,您可以動態編寫配置,但應重置Web應用程序並註銷客戶。 –