依赖项解析

注意

仅限 EF6 及更高版本 - 此页面中讨论的功能、API 等已引入实体框架 6。 如果使用的是早期版本,则部分或全部信息不适用。

从 EF6 开始,实体框架包含一种通用机制,用于获取所需服务的实现。 也就是说,当 EF 使用某些接口或基类的实例时,它将要求使用该接口或基类的具体实现。 这可通过使用 IDbDependencyResolver 接口实现:

public interface IDbDependencyResolver
{
    object GetService(Type type, object key);
}

GetService 方法通常由 EF 调用,由 EF 或应用程序提供的 IDbDependencyResolver 的实现处理。 调用时,类型参数是所请求服务的接口或基类类型,键对象为 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 在构建模型时连接到数据库。 其次,可用于强制 Code First 为特定数据库版本生成模型,例如,强制为 SQL Server 2005 生成模型,即使有时使用的是 SQL Server 2008。

返回的对象:单一实例 - 同一对象可以多次使用,并同时由不同的线程使用

键:未使用,将为 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 提供程序添加对地理和几何空间类型的支持

键:可使用两种方式请求 DbSptialServices。 首先,使用 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 到 EF 迁移使用的 __MigrationHistory 表的映射。 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, Action<string>, System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter>

引入的版本:EF6.0.0

返回的对象:一个用于创建数据库日志格式化程序的工厂,在给定上下文中设置 context.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 对象,其中包含提供程序固定名称和(可选)将使用事务处理程序的服务器名称