相依性解析
注意
僅限 EF6 及更新版本 - Entity Framework 6 已引進此頁面中所討論的功能及 API 等等。 如果您使用的是較早版本,則不適用部分或全部的資訊。
從EF6開始,Entity Framework 包含一般用途機制,可用來取得所需的服務實作。 也就是說,當EF使用某些介面或基類的實例時,它會要求使用介面或基類的具體實作。 這可透過使用 IDbDependencyResolver 介面來達成:
public interface IDbDependencyResolver
{
object GetService(Type type, object key);
}
GetService 方法通常是由 EF 呼叫,並由 EF 或應用程式提供的 IDbDependencyResolver 實作來處理。 呼叫時,type 自變數是所要求服務的介面或基類類型,而索引鍵物件為 Null 或提供所要求服務內容信息的物件。
除非另有說明傳回的任何對象都必須是安全線程,因為它可以當做單一物件使用。 在許多情況下,傳回的對像是處理站,在此情況下,處理站本身必須是安全線程,但從處理站傳回的物件不需要安全線程,因為每次使用都會從處理站要求新的實例。
本文不包含如何實作 IDbDependencyResolver 的完整詳細數據,而是做為服務類型(也就是介面和基類類型)的參考,EF 會針對每個呼叫呼叫 GetService 和索引鍵物件的語意。
System.Data.Entity.IDatabaseInitializer<TContext>
引進的版本:EF6.0.0
傳回的物件:指定之內容類型的資料庫初始化表達式
機碼:未使用;會是 Null
Func<System.Data.Entity.Migrations.Sql.MigrationSqlGenerator>
引進的版本:EF6.0.0
傳回的物件:用來建立 SQL 產生器的處理站,可用於移轉,以及導致建立資料庫的其他動作,例如使用資料庫初始化表達式建立資料庫。
索引鍵:字串,包含 ADO.NET 提供者不因名稱而異,指定將產生 SQL 的資料庫類型。 例如,會針對索引鍵 「System.Data.SqlClient」 傳回 SQL Server SQL 產生器。
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Entity.Core.Common.DbProviderServices
引進的版本:EF6.0.0
傳回的物件:要用於指定提供者不因名稱而異的 EF 提供者
索引鍵:字串,包含 ADO.NET 提供者不變的名稱,指定提供者所需的資料庫類型。 例如,會傳回密鑰 “System.Data.SqlClient” 的 SQL Server 提供者。
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Entity.Infrastructure.IDbConnectionFactory
引進的版本:EF6.0.0
傳回的物件:EF 依慣例建立資料庫連接時將使用的連接處理站。 也就是說,未將任何連線或 連接字串 提供給 EF,且 app.config 或 web.config 中找不到任何 連接字串,則此服務會用來依慣例建立連線。 變更連線處理站可讓 EF 預設使用不同類型的資料庫(例如 SQL Server Compact Edition)。
機碼:未使用;會是 Null
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Entity.Infrastructure.IManifestTokenService
引進的版本:EF6.0.0
傳回的物件:可從連接產生提供者指令清單令牌的服務。 此服務通常會以兩種方式使用。 首先,它可以用來避免在建置模型時先連線到資料庫的程序代碼。 其次,它可以用來強制 Code First 建置特定資料庫版本的模型,例如,強制使用 SQL Server 2005 的模型,即使有時使用 SQL Server 2008 也一樣。
物件存留期:Singleton -- 同一個物件可以多次使用,並同時由不同的線程使用
機碼:未使用;會是 Null
System.Data.Entity.Infrastructure.IDbProviderFactoryService
引進的版本:EF6.0.0
傳回的物件:可從指定連接取得提供者處理站的服務。 在 .NET 4.5 上,提供者可從聯機公開存取。 在 .NET 4 上,此服務的默認實作會使用一些啟發學習法來尋找比對提供者。 如果這些失敗,則可以註冊此服務的新實作,以提供適當的解決方案。
機碼:未使用;會是 Null
Func<DbContext、System.Data.Entity.Infrastructure.IDbModelCacheKey>
引進的版本:EF6.0.0
傳回的物件:將針對指定內容產生模型快取索引鍵的處理站。 根據預設,EF 會為每個提供者快取每個 DbContext 類型一個模型。 此服務的不同實作可用來將架構名稱等其他資訊新增至快取索引鍵。
機碼:未使用;會是 Null
System.Data.Entity.Spatial.DbSpatialServices
引進的版本:EF6.0.0
傳回的物件:EF 空間提供者,可將支援新增至地理和幾何空間類型的基本 EF 提供者。
機碼:D bSpatialServices 會以兩種方式要求。 首先,會使用 DbProviderInfo 物件(其中包含不因名稱與指令清單令牌)作為密鑰,要求提供者特定的空間服務。 其次,可以要求 DbSpatialServices 沒有密鑰。 這可用來解析建立獨立 DbGeography 或 DbGeometry 類型時所使用的「全域空間提供者」。
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
Func<System.Data.Entity.Infrastructure.IDbExecutionStrategy>
引進的版本:EF6.0.0
傳回的物件:建立服務的處理站,可讓提供者在對資料庫執行查詢和命令時實作重試或其他行為。 如果未提供任何實作,則 EF 只會執行命令並傳播擲回的任何例外狀況。 對於 SQL Server,此服務用來提供重試原則,在針對 SQL Azure 等雲端式資料庫伺服器執行時特別有用。
索引鍵:ExecutionStrategyKey 物件,其中包含提供者不變的名稱,以及選擇性地使用執行策略的伺服器名稱。
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
Func<DbConnection, string, System.Data.Entity.Migrations.History.HistoryContext>
引進的版本:EF6.0.0
傳回的物件:一個處理站,可讓提供者設定 HistoryContext 與 __MigrationHistory
EF 移轉所使用的數據表的對應。 HistoryContext 是 Code First DbContext,可以使用一般 Fluent API 來設定變更數據表名稱和數據行對應規格等專案。
機碼:未使用;會是 Null
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Common.DbProviderFactory
引進的版本:EF6.0.0
傳回的物件:要用於指定提供者不變名稱 ADO.NET 提供者。
索引鍵:包含 ADO.NET 提供者不可變名稱的字串
注意
此服務通常不會直接變更,因為預設實作會使用一般 ADO.NET 提供者註冊。 如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Entity.Infrastructure.IProviderInvariantName
引進的版本:EF6.0.0
傳回的物件:用來判斷指定 DbProviderFactory 類型的提供者不變異名稱的服務。 此服務的預設實作會使用 ADO.NET 提供者註冊。 這表示如果 ADO.NET 提供者未以正常方式註冊,因為 EF 正在解析 DbProviderFactory,則也必須解析此服務。
機碼:需要不因名稱而異的 DbProviderFactory 實例。
注意
如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。
System.Data.Entity.Core.Mapping.ViewGeneration.IViewAssemblyCache
引進的版本:EF6.0.0
傳回的物件:包含預先產生檢視之元件的快取。 取代通常用來讓 EF 知道哪些元件包含預先產生的檢視,而不需要進行任何探索。
機碼:未使用;會是 Null
System.Data.Entity.Infrastructure.Pluralization.IPluralizationService
引進的版本:EF6.0.0
傳回的物件:EF 用來複數和單數化名稱的服務。 預設會使用英文複數服務。
機碼:未使用;會是 Null
System.Data.Entity.Infrastructure.Interception.IDbInterceptor
引進的版本:EF6.0.0
傳回的物件:應用程式啟動時應該註冊的任何攔截器。 請注意,這些物件是使用 GetServices 呼叫要求,而任何相依性解析程式所傳回的所有攔截器都會註冊。
機碼:未使用;會是 Null。
Func<System.Data.Entity.DbContext, 動作<字串>, System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter>
引進的版本:EF6.0.0
傳回的物件:將用來建立資料庫記錄格式子的處理站,將在內容時使用。Database.Log 屬性是在指定的內容上設定。
機碼:未使用;會是 Null。
Func<System.Data.Entity.DbContext>
引進的版本:EF6.1.0
傳回的物件:當內容沒有可存取的無參數建構函式時,將用來建立移轉的內容實例的處理站。
索引鍵:需要處理站之衍生 DbContext 類型的 Type 物件。
Func<System.Data.Entity.Core.Metadata.Edm.IMetadataAnnotationSerializer>
引進的版本:EF6.1.0
傳回的物件:將用來建立串行化程序進行強型別自定義批注串行化的處理站,以便將其串行化和還原串行化為 XML,以用於 Code First 移轉。
索引鍵:正在串行化或還原串行化的批注名稱。
Func<System.Data.Entity.Infrastructure.TransactionHandler>
引進的版本:EF6.1.0
傳回的物件:將用來建立交易處理程式的處理站,以便針對處理認可失敗等情況套用特殊處理。
機碼:ExecutionStrategyKey 物件,其中包含提供者不變的名稱,以及選擇性地使用事務處理程式的伺服器名稱。