組態檔設定
Entity Framework 允許從組態檔指定一些設定。 一般而言,EF 遵循「關於設定的慣例」原則:本文中討論的所有設定都有默認行為,您只需要擔心在預設值不再符合您的需求時變更設定。
設定數據指導方針
- 永遠不要將密碼或其他敏感性資料儲存在設定提供者程式碼或純文字設定檔中。
- 不要在開發或測試環境中使用生產環境祕密。
- 請在專案外部指定祕密,以防止其意外認可至開放原始碼存放庫。
- 請考慮使用 受保護的組態來保護組態檔的內容。
警告
本文使用本機資料庫,其不需要使用者進行驗證。 實際執行應用程式應該使用可用的最安全驗證流程。 如需已部署測試與實際執行應用程式驗證的詳細資訊,請參閱安全驗證流程。
程序代碼型替代專案
所有這些設定也可以使用程式代碼來套用。 從EF6開始,我們引進了 以程式代碼為基礎的設定,其提供從程式碼套用設定的集中方式。 在 EF6 之前,您仍然可以從程式碼套用設定,但您必須使用各種 API 來設定不同的區域。 組態檔選項可讓這些設定在部署期間輕鬆變更,而不需要更新您的程序代碼。
Entity Framework 組態區段
從 EF4.1 開始,您可以使用組態檔的 appSettings 區段來設定內容的資料庫初始化表達式。 在 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 如何決定要使用的資料庫的詳細資訊,包括組態檔中的 連接字串。
連接字串會進入標準 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 Connection Factory
組態區段可讓您指定 Code First 應該用來尋找要用於內容之資料庫的預設連接處理站。 只有在沒有將任何 連接字串 新增至內容組態檔時,才會使用默認連線處理站。
當您安裝 EF NuGet 套件時,會根據您已安裝的默認連線處理站,註冊指向 SQL Express 或 LocalDB。
若要設定連接處理站,您可以在 defaultConnectionFactory 專案中指定元件限定類型名稱。
注意
元件限定名稱是命名空間限定名稱,後面接著逗號,然後是類型所在的元件。 您也可以選擇性地指定元件版本、文化特性和公鑰令牌。
以下是設定您自己的預設連線處理站的範例:
<entityFramework>
<defaultConnectionFactory type="MyNamespace.MyCustomFactory, MyAssembly"/>
</entityFramework>
上述範例需要自定義處理站具有無參數建構函式。 如有需要,您可以使用parameters元素來指定建構函式參數。
例如,Entity Framework 中包含的 SqlCeConnectionFactory 會要求您提供提供者不變的名稱給建構函式。 提供者不變的名稱會識別您想要使用的 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 會使用 SqlConnectionFactory,指向 .\SQLEXPRESS
。 SqlConnectionFactory 也有可讓您覆寫 連接字串 部分的建構函式。 如果您想要使用非 .\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>