ADO.NET Entity Framework 中的連接字串
連接字串 (Connection String) 包含可當做參數從資料提供者 (Data Provider) 傳遞至資料來源的初始化資訊。 此語法會因資料提供者而不同,而且連接字串會在嘗試開啟連接期間進行剖析。 Entity Framework 所使用的連接字串包含用來連接至支援 Entity Framework 之基礎 ADO.NET 資料提供者的資訊。 它們也包含必要之模型和對應檔的相關資訊。
EntityClient 提供者會在存取模型和對應中繼資料,以及連接至資料來源時使用連接字串。 您可以透過 ConnectionString 的 EntityConnection 屬性來存取或設定連接字串。 EntityConnectionStringBuilder 類別 (Class) 可用來以程式設計方式建構或存取連接字串中的參數。
實體資料模型工具會產生儲存在應用程式組態檔中的連接字串。 ObjectContext 會在建立物件查詢時自動擷取這個連接資訊。 您可以從 EntityConnection 屬性中存取 ObjectContext 執行個體 (Instance) 所使用的 Connection。
連接字串語法
若要了解連接字串的一般語法,請參閱連接字串語法 | ADO.NET 中的連接字串。
連接字串參數
下表列出 ConnectionString 中關鍵字值的有效名稱。
關鍵字 | 描述 |
---|---|
Provider |
如果沒有指定 Name 關鍵字,就是必要項。 用來擷取基礎提供者之 DbProviderFactory 物件的提供者名稱。 這個值是常數。當 Name 關鍵字未包含在實體連接字串中時,需要 Provider 關鍵字的非空白值。 此關鍵字與 Name 關鍵字互斥。 |
Provider Connection String |
選擇性。 指定傳給基礎資料來源的提供者特定連接字串。 這個連接字串會包含資料提供者的有效關鍵字/值組。 無效的 Provider Connection String 會在資料來源對其進行評估時導致執行階段錯誤。此關鍵字與 Name 關鍵字互斥。請務必根據 ADO.NET 連接字串的一般語法逸出值。 請考慮下列連接字串: Server=serverName; User ID = userID 。 因為它包含分號所以必須逸出。 不包含雙引號,因此可用於逸出:Provider Connection String ="Server=serverName; User ID = userID"; |
Metadata |
如果沒有指定 Name 關鍵字,就是必要項。 目錄、檔案和資源位置的垂直線分隔清單,您可在其中尋找中繼資料和對應資訊。 以下是一個範例:Metadata= c:\model | c:\model\sql\mapping.msl; 忽略垂直線分隔符號兩端的空白。 此關鍵字與 Name 關鍵字互斥。 |
Name |
應用程式可選擇性的在應用程式組態檔中指定連接名稱,以提供必要的關鍵字/值連接字串值。 在此情況下,您不能在連接字串中直接提供這些值。 在組態檔中不允許 Name 關鍵字。當 Name 關鍵字未包含在連接字串中時,需要 Provider 關鍵字的非空白值。此關鍵字與所有其他連接字串關鍵字互斥。 |
模型和對應檔案位置
Metadata
參數包含要讓 EntityClient
提供者搜尋模型和對應檔案的位置清單。 模型和對應檔案通常會與應用程式可執行檔部署在相同的目錄中。 這些檔案也可以部署在特定位置中,或當做內嵌資源包含在應用程式中。
內嵌資源的指定方式如下:
Metadata=res://<assemblyFullName>/<resourceName>
下列選項可用於定義內嵌資源的位置:
選項 | 描述 |
---|---|
assemblyFullName |
含有內嵌資源之組件 (Assembly) 的完整名稱。 此名稱包括簡單名稱、版本名稱、支援的文化特性 (Culture) 和公開金鑰 (Public Key),如下所示:ResourceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 資源可以內嵌在應用程式可存取的任何組件中。 如果您針對 assemblyFullName 指定了萬用字元 (*),Entity Framework 執行階段將會按照這個順序在下列位置中搜尋資源:1.呼叫組件。 2.參考的組件。 3.位於應用程式間隔目錄中的組件。 如果這些檔案不在其中一個位置內,就會擲回例外狀況 (Exception)。 請注意:當您使用萬用字元 (*) 時,Entity Framework 必須逐一查看所有組件,以便找出含有正確名稱的資源。 若要改善效能,請指定組件名稱而非萬用字元。 |
resourceName |
內含資源的名稱,例如 AdventureWorksModel.csdl。 中繼資料服務只會尋找具有下列其中一個副檔名的檔案或資源:.csdl、.ssdl 或 .msl。 如果沒有指定 resourceName ,就會載入所有中繼資料資源。 這些資源應該在組件中具有唯一的名稱。 如果您在組件的不同目錄中定義了具有相同名稱的多個檔案,resourceName 就必須在資源名稱前面包含資料夾結構,例如 FolderName.FileName.csdl。當您針對 resourceName 指定萬用字元 (*) 時,不需要使用 assemblyFullName 。 |
注意
若要改善效能,請在呼叫組件中內嵌資源,但非 Web 案例 (呼叫組件中沒有基礎對應和中繼資料檔案的參考) 除外。
下列範例會載入呼叫組件、參考的組件和應用程式 bin 目錄中其他組件的所有模型和對應檔案。
Metadata=res://*/
下列範例會從 AdventureWorks 組件中載入 model.csdl 檔案,並且從執行中應用程式的預設目錄中載入 model.ssdl 和 model.msl 檔案。
Metadata=res://AdventureWorks, 1.0.0.0, neutral, a14f3033def15840/model.csdl|model.ssdl|model.msl
下列範例會從特定組件中載入三個指定的資源。
Metadata=res://AdventureWorks, 1.0.0.0, neutral, a14f3033def15840/model.csdl|
res://AdventureWorks, 1.0.0.0, neutral, a14f3033def15840/model.ssdl|
res://AdventureWorks, 1.0.0.0, neutral, a14f3033def15840/model.msl
下列範例會從組件中載入具有副檔名 .csdl、.msl 和 .ssdl 的所有內嵌資源。
Metadata=res://AdventureWorks, 1.0.0.0, neutral, a14f3033def15840/
下列範例會從已載入的組件位置中載入相對檔案路徑加上 "datadir\metadata\" 的所有資源。
Metadata=datadir\metadata\
下列範例會從已載入的組件位置中載入相對檔案路徑的所有資源。
Metadata=.\
|DataDirectory| 替代字串和 Web 應用程式根目錄運算子 (~) 的支援
DataDirectory
和 ~ 運算子會用於 ConnectionString 中,當做 Metadata
和 Provider Connection String
關鍵字的一部分。 EntityConnection 會分別將 DataDirectory
和 ~ 運算子轉送至 MetadataWorkspace 和存放區提供者。
詞彙 | 描述 |
---|---|
|DataDirectory| |
解析成對應和中繼資料檔案的相對路徑。 這是透過 AppDomain.SetData("DataDirectory", objValue) 方法所設定的值。 DataDirectory 替代字串必須以垂直線字元括住,而且其名稱與垂直線字元之間不得存在任何空白字元。 DataDirectory 名稱不區分大小寫。如果名為 "DataDirectory" 的實體目錄必須當做中繼資料路徑清單的成員傳遞,請在名稱的任一側或兩側加上空白字元。 例如: Metadata="DataDirectory1 | DataDirectory | DataDirectory2" 。 ASP.NET 應用程式會將 |DataDirectory| 解析成 "<application root>/app_data" 資料夾。 |
~ | 解析成 Web 應用程式根目錄。 位於前置位置的 ~ 字元一律會解譯成 Web 應用程式根目錄運算子 (~),不過它可能會代表有效的本機子目錄。 若要參考這類本機子目錄,使用者應該明確傳遞 ./~ 。 |
您應該只在路徑的開頭指定 DataDirectory
和 ~ 運算子,因為它們無法在任何其他位置進行解析。 Entity Framework 將嘗試解析 ~/data
,但是它會將 /data/~
視為實體路徑。
以 DataDirectory
或 ~ 運算子為開頭的路徑無法解析成 DataDirectory
和 ~ 運算子分支外部的實體路徑。 例如,下列路徑將會解析:~
、~/data
和 ~/bin/Model/SqlServer
。 下列路徑將無法解析:~/..
和 ~/../other
。
DataDirectory
和 ~ 運算子可擴充成包含子目錄,如下所示:|DataDirectory|\Model
和 ~/bin/Model
。
DataDirectory
替代字串和 ~ 運算子的解析並非遞迴方式。 例如,當 DataDirectory
包含 ~
字元時,就會發生例外狀況。 這可防止無限遞迴 (Infinite Recursion)。