連線字串和模型

本主題涵蓋 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=  
                               &quot;Data Source=.\sqlexpress;  
                                     Initial Catalog=Northwind;  
                                     Integrated Security=True;  
                                     MultipleActiveResultSets=True&quot;"  
         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 提供者搭配使用;您可以將不同的 I連線ionFactory 實作設定為內容來變更。Database.Default連線ionFactory。
  • 您可以將它傳遞至 DbCoNtext 建構函式,以使用現有的 Db連線ion 物件。 如果連線物件是 Entity 的實例連線ion,則會使用連接中指定的模型,而不是使用 Code First 計算模型。 如果物件是某些其他類型的實例,例如 Sql連線ion,則內容會用於 Code First 模式。
  • 您可以將現有的 ObjectCoNtext 傳遞至 DbCoNtext 建構函式,以建立包裝現有內容的 DbCoNtext。 這可用於使用 ObjectCoNtext 但想要在應用程式的某些部分利用 DbCoNtext 的現有應用程式。