三層架構專案,LINQ to SQL 類別 (.dbml) 放在 DAL 專案。原開發機一切正常,部署至新伺服器後,無論如何修改 web.config 或 DAL 專案 app.config,連線字串都不生效,拋出 Timeout expired 或 Cannot open database。
LINQ to SQL 設計器產生的 DataContext 建構函式預設讀取 **專案屬性 (Properties) → Settings.settings** 中的連線字串,**而非** web.config / app.config 的 <connectionStrings> 區段。
MyProject.Properties.Settings.ConnStr。在 Visual Studio 中直接修改 Settings.settings 的 Value 為正確連線字串,重新編譯部署。
在 DAL 專案建立 DataContext 的部分類別,覆寫建構函式:
// DAL/MyDataContext.partial.cs
public partial class MyDataContext
{
public MyDataContext() :
base(GetConnectionString(), mappingSource)
{
OnCreated();
}
private static string GetConnectionString()
{
// 優先從 web.config/app.config 讀取
return ConfigurationManager.ConnectionStrings["MyConnStr"].ConnectionString;
}
}
呼叫端無需修改:using (var db = new MyDataContext()) { ... } 即自動使用正確連線字串。
public partial class MyDataContext
{
public MyDataContext(string connectionString) : base(connectionString) { }
}
// 使用時
string connStr = ConfigurationManager.ConnectionStrings["MyConnStr"].ConnectionString;
using (var db = new MyDataContext(connStr)) { ... }
<connectionStrings>
<add name="MyConnStr"
connectionString="Data Source=192.168.1.100;Initial Catalog=MyDB;User ID=sa;Password=P@ssw0rd;Connect Timeout=30;"
providerName="System.Data.SqlClient" />
</connectionStrings>
| 誤區 | 事實 |
|---|---|
| 修改 web.config 就能改變 LINQ 連線字串 | 預設讀取 Settings.settings,需覆寫建構函式 |
| DAL 專案 app.config 會被讀取 | 類庫專案 app.config **不會** 自動生效,需手動讀取 |
| 連線字串加密後 LINQ 無法使用 | 程式碼讀取時解密即可,或用 ProtectedConfigurationProvider |
MainDB、LogDB),避免硬編碼。DbContext 透過 DI 注入 IConfiguration,架構更清晰。