組態檔設定

Entity Framework 允許從組態檔指定一些設定。 一般而言,EF 遵循「關於設定的慣例」原則:本文中討論的所有設定都有預設行為,您只需要擔心在預設值不再符合您的需求時變更設定。

程式碼型替代專案

所有這些設定也可以使用程式碼來套用。 從 EF6 開始,我們引進了 以程式碼為基礎的 設定,其提供從程式碼套用設定的集中方式。 在 EF6 之前,您仍然可以從程式碼套用設定,但您必須使用各種 API 來設定不同的區域。 組態檔選項可讓這些設定在部署期間輕鬆變更,而不需要更新您的程式碼。

Entity Framework 組態區段

從 EF4.1 開始,您可以使用組態檔的 app設定 區段來設定內容 的資料庫初始化運算式。 在 EF 4.3 中,我們引進了自訂 entityFramework 區段來處理新的設定。 Entity Framework 仍會辨識使用舊格式所設定的資料庫初始化運算式,但建議您盡可能移至新的格式。

當您 安裝 EntityFramework NuGet 套件時,entityFramework 區段會自動新增至專案的組態檔。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework"
       type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
</configuration>

連接字串

此頁面 提供 Entity Framework 如何決定要使用的資料庫的詳細資料,包括組態檔中的連接字串。

連線ion 字串會進入標準 connectionStrings 元素,而且不需要 entityFramework 區段。

程式碼第一個型模型使用一般 ADO.NET 連接字串。 例如:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;Integrated Security=True;"/>
</connectionStrings>

EF 設計工具型模型會使用特殊的 EF 連接字串。 例如:

<connectionStrings>
  <add name="BlogContext"  
    connectionString=
      "metadata=
        res://*/BloggingModel.csdl|
        res://*/BloggingModel.ssdl|
        res://*/BloggingModel.msl;
      provider=System.Data.SqlClient;
      provider connection string=
        &quot;data source=(localdb)\mssqllocaldb;
        initial catalog=Blogging;
        integrated security=True;
        multipleactiveresultsets=True;&quot;"
     providerName="System.Data.EntityClient" />
</connectionStrings>

程式碼型設定類型 (EF6 及更新版本)

從 EF6 開始,您可以指定 DBConfiguration for EF,以用於 應用程式中的程式碼型組態 。 在大部分情況下,您不需要指定此設定,因為 EF 會自動探索您的 DbConfiguration。 如需何時可能需要在組態檔中指定 DbConfiguration 的詳細資訊,請參閱 程式碼型 設定的 移動 DbConfiguration 一節。

若要設定 DbConfiguration 類型,您可以在 codeConfigurationType 專案中指定元件限定類型名稱

注意

元件限定名稱是命名空間限定名稱,後面接著逗號,然後是類型所在的元件。 您也可以選擇性地指定元件版本、文化特性和公開金鑰權杖。

<entityFramework codeConfigurationType="MyNamespace.MyConfiguration, MyAssembly">
</entityFramework>

EF 資料庫提供者 (EF6 及更新版本)

在 EF6 之前,資料庫提供者的 Entity Framework 特定部分必須包含在核心 ADO.NET 提供者中。 從 EF6 開始,EF 特定元件現在會分別管理和註冊。

通常您不需要自行註冊提供者。 這通常是由提供者在安裝時完成。

提供者會藉由在 entityFramework 區段的 providers 子區段下加入 provider 元素來註冊。 提供者專案有兩個必要屬性:

  • invariantName 會識別此 EF 提供者目標的核心 ADO.NET 提供者
  • type 是 EF 提供者實作的元件限定類型名稱

注意

元件限定名稱是命名空間限定名稱,後面接著逗號,然後是類型所在的元件。 您也可以選擇性地指定元件版本、文化特性和公開金鑰權杖。

例如,當您安裝 Entity Framework 時,會建立用來註冊預設 SQL Server 提供者的專案。

<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

攔截器 (EF6.1 更新版本)

從 EF6.1 開始,您可以在組態檔中註冊攔截器。 攔截器可讓您在 EF 執行特定作業時執行其他邏輯,例如執行資料庫查詢、開啟連線等等。

攔截器是藉由在 entityFramework 區段的 攔截子 子區段 下加入 攔截器 元素來註冊。 例如,下列組態會註冊將所有資料庫作業記錄到主控台的內 建 DatabaseLogger 攔截器。

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"/>
</interceptors>

將資料庫作業記錄至檔案 (EF6.1 及更新版本)

當您想要將記錄新增至現有的應用程式以協助偵錯問題時,透過組態檔註冊攔截器特別有用。 DatabaseLogger 支援藉由提供檔案名做為建構函式參數來記錄檔案。

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
    </parameters>
  </interceptor>
</interceptors>

根據預設,這會導致每次應用程式啟動時,都會以新的檔案覆寫記錄檔。 如果記錄檔已經存在,請改為附加至記錄檔,請使用類似下列專案:

<interceptors>
  <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
    <parameters>
      <parameter value="C:\Temp\LogOutput.txt"/>
      <parameter value="true" type="System.Boolean"/>
    </parameters>
  </interceptor>
</interceptors>

如需 DatabaseLogger 和註冊攔截器的其他資訊 ,請參閱部落格文章 EF 6.1:開啟記錄而不重新編譯

Code First Default 連線ion Factory

組態區段可讓您指定 Code First 應該用來尋找要用於內容之資料庫的預設連接處理站。 只有在內容未將任何連接字串新增至組態檔時,才會使用預設連線處理站。

當您安裝 EF NuGet 套件時,會根據您已安裝的預設連線處理站,註冊指向 SQL Express 或 LocalDB。

若要設定連線處理站,您可以在 default連線ionFactory 元素中 指定元件限定類型名稱。

注意

元件限定名稱是命名空間限定名稱,後面接著逗號,然後是類型所在的元件。 您也可以選擇性地指定元件版本、文化特性和公開金鑰權杖。

以下是設定您自己的預設連線處理站的範例:

<entityFramework>
  <defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>

上述範例需要自訂處理站具有無參數建構函式。 如有需要,您可以使用 parameters 元素來指定建 構函式參數。

例如,包含在 Entity Framework 中的 SqlCe連線ionFactory 會要求您提供提供者不可變的名稱給建構函式。 提供者不變的名稱會識別您想要使用的 SQL Compact 版本。 下列設定會導致內容預設使用 SQL Compact 4.0 版。

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="System.Data.SqlServerCe.4.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

如果您未設定預設連接處理站,Code First 會使用 Sql連線ionFactory,指向 .\SQLEXPRESS 。 Sql連線ionFactory 也有可讓您覆寫連接字串部分的建構函式。 如果您想要使用非 .\SQLEXPRESS SQL Server 實例,您可以使用這個建構函式來設定伺服器。

下列設定會導致 Code First 針對沒有明確連接字串集的內容使用 MyDatabaseServer

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="Data Source=MyDatabaseServer; Integrated Security=True; MultipleActiveResultSets=True" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>

根據預設,假設建構函式引數的類型為字串。 您可以使用 type 屬性來變更此專案。

<parameter value="2" type="System.Int32" />

資料庫初始化運算式

資料庫初始化運算式是以每個內容為基礎進行設定。 您可以使用內容 元素在組態檔 中設定它們。 這個專案會使用元件限定名稱來識別所設定的內容。

根據預設,Code First 內容會設定為使用 CreateDatabaseIfNotExists 初始化運算式。 內容 元素上有 disableDatabaseInitialization 屬性,可用來停用資料庫初始化。

例如,下列組態會停用 MyAssembly.dll 中定義的 Blogging.BlogCoNtext 內容的資料庫初始化。

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly" disableDatabaseInitialization="true" />
</contexts>

您可以使用 databaseInitializer 元素來設定自訂初始化運算式。

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" />
  </context>
</contexts>

建構函式參數會使用與預設連接處理站相同的語法。

<contexts>
  <context type=" Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly">
      <parameters>
        <parameter value="MyConstructorParameter" />
      </parameters>
    </databaseInitializer>
  </context>
</contexts>

您可以設定 Entity Framework 中包含的其中一個泛型資料庫初始化運算式。 類型 屬性會針對泛型型別使用 .NET Framework 格式。

例如,如果您使用 Code First 移轉,則可以使用 MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration> 初始化運算式將資料庫設定為自動移轉。

<contexts>
  <context type="Blogging.BlogContext, MyAssembly">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Blogging.BlogContext, MyAssembly], [Blogging.Migrations.Configuration, MyAssembly]], EntityFramework" />
  </context>
</contexts>