組態檔設定
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=
"data source=(localdb)\mssqllocaldb;
initial catalog=Blogging;
integrated security=True;
multipleactiveresultsets=True;""
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>