連接字串和模型
本文涵蓋 Entity Framework 如何探索要使用的資料庫連線,以及如何變更它。 使用 Code First 和 EF 設計工具建立的模型會涵蓋。
警告
本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程。
Entity Framework 應用程式通常會使用衍生自 DbContext 的類別。 這個衍生類別會呼叫基底 DbContext 類別上的其中一個建構函式來控制:
- 內容如何連接到資料庫,也就是如何找到和使用 連接字串。
- 內容是使用 Code First 計算模型,還是載入以 EF 設計工具建立的模型。
- 其他進階選項
下列片段顯示可以使用 DbContext 建構函式的一些方式。
依慣例使用 Code First 與連線
如果您尚未在應用程式中執行任何其他組態,則在 DbContext 上呼叫無參數建構函式會導致 DbContext 在 Code First 模式中執行,並具有慣例所建立的資料庫連線。 例如:
namespace Demo.EF
{
public class BloggingContext : DbContext
{
public BloggingContext()
// C# will call base class parameterless constructor by default
{
}
}
}
在此範例中,DbContext 會使用衍生內容類別的命名空間限定名稱 Demo.EF.BloggingContext 作為資料庫名稱,並使用 SQL Express 或 LocalDB 為此資料庫建立 連接字串。 如果兩者都已安裝,將會使用 SQL Express。
Visual Studio 2010 預設包含 SQL Express,Visual Studio 2012 和更新版本包含 LocalDB。 安裝期間,EntityFramework NuGet 套件會檢查可用的資料庫伺服器。 NuGet 套件接著會設定 Code First 在依照慣例建立連接時所使用的預設資料庫伺服器,以更新組態檔。 如果 SQL Express 正在執行,則會使用它。 如果無法使用 SQL Express,則 LocalDB 會改為註冊為預設值。 如果組態檔已經包含預設連接處理站的設定,則不會對組態檔進行任何變更。
依慣例使用 Code First 搭配連接,並指定資料庫名稱
如果您尚未在應用程式中執行任何其他組態,則以您想要使用的資料庫名稱呼叫 DbContext 上的字串建構函式,會導致 DbContext 在 Code First 模式中執行,而資料庫連接是由慣例所建立的資料庫連線至該名稱的資料庫。 例如:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingDatabase")
{
}
}
在此範例中,DbContext 使用 「BloggingDatabase」 作為資料庫名稱,並使用 SQL Express 建立此資料庫的 連接字串(隨 Visual Studio 2010 一起安裝)或 LocalDB(隨 Visual Studio 2012 一起安裝)。 如果兩者都已安裝,將會使用 SQL Express。
在 app.config/web.config 檔案中使用 Code First 搭配 連接字串
您可以選擇將 連接字串 放在 app.config 或 web.config 檔案中。 例如:
<configuration>
<connectionStrings>
<add name="BloggingCompactDatabase"
providerName="System.Data.SqlServerCe.4.0"
connectionString="Data Source=Blogging.sdf"/>
</connectionStrings>
</configuration>
這是一種簡單的方法,可告訴 DbContext 使用 SQL Express 或 LocalDB 以外的資料庫伺服器, 上述範例會指定 SQL Server Compact Edition 資料庫。
如果 連接字串 的名稱符合您的內容名稱(不論是否具有命名空間限定性),則使用無參數建構函式時,DbContext 就會找到它。 如果 連接字串 名稱與內容的名稱不同,您可以將 連接字串 名稱傳遞至 DbContext 建構函式,告訴 DbContext 在 Code First 模式中使用此連線。 例如:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("BloggingCompactDatabase")
{
}
}
或者,您可以針對傳遞至 DbContext 建構函式的字串,使用 「name=<連接字串 name>」 格式。 例如:
public class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingCompactDatabase")
{
}
}
此窗體會明確表示您希望在組態檔中找到 連接字串。 如果找不到具有指定名稱的 連接字串,將會擲回例外狀況。
app.config/web.config 檔案中具有 連接字串 的資料庫/模型第一個
使用 EF 設計工具建立的模型與 Code First 不同,因為您的模型已經存在,而且應用程式執行時不會從程式碼產生。 模型通常以專案中的EDMX檔案的形式存在。
設計工具會將 EF 連接字串 新增至 app.config 或 web.config 檔案。 此 連接字串 特別包含如何在EDMX檔案中尋找資訊的相關信息。 例如:
<configuration>
<connectionStrings>
<add name="Northwind_Entities"
connectionString="metadata=res://*/Northwind.csdl|
res://*/Northwind.ssdl|
res://*/Northwind.msl;
provider=System.Data.SqlClient;
provider connection string=
"Data Source=.\sqlexpress;
Initial Catalog=Northwind;
Integrated Security=True;
MultipleActiveResultSets=True""
providerName="System.Data.EntityClient"/>
</connectionStrings>
</configuration>
EF 設計工具也會產生程式代碼,告知 DbContext 將 連接字串 名稱傳遞至 DbContext 建構函式,讓 DbContext 使用此連接。 例如:
public class NorthwindContext : DbContext
{
public NorthwindContext()
: base("name=Northwind_Entities")
{
}
}
DbContext 知道載入現有的模型(而不是使用 Code First 從程式代碼計算模型),因為 連接字串 是 EF 連接字串,其中包含要使用的模型詳細數據。
其他 DbContext 建構函式選項
DbContext 類別包含其他建構函式和使用模式,可啟用一些更進階的案例。 其中的一些改進和變更如下:
- 您可以使用 DbModelBuilder 類別來建置 Code First 模型,而不需具現化 DbContext 實例。 結果是 DbModel 物件。 然後,當您準備好建立 DbContext 實例時,您可以將這個 DbModel 對象傳遞至其中一個 DbContext 建構函式。
- 您可以將完整 連接字串 傳遞至 DbContext,而不只是資料庫或 連接字串 名稱。 根據預設,此 連接字串 會與 System.Data.SqlClient 提供者搭配使用;您可以將不同的 IConnectionFactory 實作設定為內容來變更。Database.DefaultConnectionFactory。
- 您可以將它傳遞至 DbContext 建構函式,以使用現有的 DbConnection 物件。 如果連接物件是 EntityConnection 的實例,則會使用連接中指定的模型,而不是使用 Code First 計算模型。 如果對像是某些其他類型的實例,例如 SqlConnection,則內容會用於 Code First 模式。
- 您可以將現有的 ObjectContext 傳遞至 DbContext 建構函式,以建立包裝現有內容的 DbContext。 這可用於使用 ObjectContext 但想要在應用程式的某些部分利用 DbContext 的現有應用程式。