实体框架 6 提供程序Entity Framework 6 Providers

备注

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

实体框架现在正在开源许可证下开发,EF6 及更高版本不会作为 .NET Framework 的一部分提供。 这样做有许多好处,但也需要针对 EF6 程序集重建 EF 提供程序。 这就意味着 EF5 及以下版本的 EF 提供程序在重建之前不能用于 EF6。

哪些提供程序可用于 EF6?Which providers are available for EF6?

已知的针对 EF6 重建的提供程序包括:

请注意,此列表并不表示给定提供程序的功能级别或支持情况,只表示已构建了 EF6。

注册 EF 提供程序Registering EF providers

从实体框架 6 开始,可以使用基于代码的配置或在应用程序的配置文件中注册 EF 提供程序。

配置文件注册Config file registration

在 app.config 或 web.config 中注册 EF 提供程序的格式如下:

  1. <entityFramework>
  2. <providers>
  3. <provider invariantName="My.Invariant.Name" type="MyProvider.MyProviderServices, MyAssembly" />
  4. </providers>
  5. </entityFramework>

请注意,如果从 NuGet 安装 EF 提供程序,则通常 NuGet 包会自动将此注册添加到配置文件中。 如果向非应用启动项目安装 NuGet 包,则可能需要将该注册复制到启动项目的配置文件中。

此注册中的“invariantName”是用于标识 ADO.NET 提供程序的相同固定名称。 它是 DbProviderFactories 注册中的“invariant”属性,是连接字符串注册中的“providerName”属性。 要使用的固定名称也应包含在该提供程序的文档中。 固定名称的示例:SQL Server 为“System.Data.SqlClient”,SQL Server Compact 为“System.Data.SqlServerCe.4.0”。

此注册中的“类型”是派生自“System.Data.Entity.Core.Common.DbProviderServices”的提供程序类型的程序集限定名称。 例如,用于 SQL Compact 的字符串是“System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact”。 此处要使用的类型应包含在该提供程序的文档中。

基于代码的注册Code-based registration

从实体框架 6 开始,可在代码中指定整个应用程序的 EF 配置。 有关完整的详细信息,请参阅实体框架基于代码的配置。 使用基于代码的配置注册 EF 提供程序的常规方法是,创建一个派生自 System.Data.Entity.DbConfiguration 的新类,并将其放置在与 DbContext 类相同的程序集中。 然后,DbConfiguration 类应在其构造函数中注册该提供程序。 例如,要注册 SQL Compact 提供程序,DbConfiguration 类如下所示:

  1. public class MyConfiguration : DbConfiguration
  2. {
  3. public MyConfiguration()
  4. {
  5. SetProviderServices(
  6. SqlCeProviderServices.ProviderInvariantName,
  7. SqlCeProviderServices.Instance);
  8. }
  9. }

在此代码中,“SqlCeProviderServices.ProviderInvariantName”为 SQL Server Compact 提供程序的固定名称字符串(“System.Data.SqlServerCe.4.0”)提供了便利,SqlCeProviderServices.Instance 会返回 SQL Compact EF 提供程序的单一实例。

如果未提供我需要的提供程序怎么办?What if the provider I need isn’t available?

如果该提供程序适用于以前版本的 EF,则建议联系提供程序的所有者并要求他们创建 EF6 版本。 应包含对 EF6 提供程序模型的文档的引用。

可以自己编写提供程序吗?Can I write a provider myself?

当然可以自己创建 EF 提供程序,但不应把这项任务考虑的太简单。 可以从上面关于 EF6 提供程序模型的链接开始着手。 你可能还会发现,从 EF 开源代码库中包含的 SQL Server 和 SQL CE 提供程序的代码着手或用作参考会很有用。

请注意,从 EF6 开始,EF 提供程序与基础 ADO.NET 提供程序的耦合紧密程度降低。 这使得编写 EF 提供程序更轻松,且无需编写或包装 ADO.NET 类。