比较 EF Core 和 EF6

EF Core

Entity Framework Core (EF Core) 是适用于 .NET 的新式对象数据库映射器。 它支持 LINQ 查询、更改跟踪、更新和架构迁移。

EF Core 通过数据库提供程序插件模型与 SQL Server/Azure SQL 数据库、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和更多数据库配合使用。

EF6

Entity Framework 6 (EF6) 是专为 .NET Framework 设计的对象关系映射器,但支持 .NET Core。 EF6 是一款受支持的稳定产品,但我们不再对其进行积极开发。

功能比较

EF Core 提供了不会在 EF6 中实现的新功能。 但是,并非所有 EF6 功能都已在 EF Core 中实现。

下表比较了 EF Core 和 EF6 中可用的功能。 这只是大致比较,没有列出全部功能,也未解释不同 EF 版本中相同功能之间的差异。

EF Core 列指出了功能首次出现的产品版本。

创建模型

功能 EF6.4 EF Core
基本类映射 1.0
带有参数的构造函数 2.1
属性值转换 2.1
没有键的映射类型 2.1
约定 1.0
自定义约定 7.0
数据注释 1.0
Fluent API 1.0
继承:每个层次结构一张表 (TPH) 1.0
继承:每个类型一张表 (TPT) 5.0
继承:每个具体类一张表 (TPC) 7.0
阴影状态属性 1.0
替换键 1.0
多对多导航 5.0
多对多,无联接实体 5.0
密钥生成:数据库 1.0
密钥生成:客户端 1.0
复杂/已拥有类型 2.0
空间数据 2.2
模型格式:代码 1.0
从数据库创建模型:命令行 1.0
从数据库更新模型 Partial 积压工作 (#831)
全局查询筛选器 2.0
表拆分 2.0
实体拆分 7.0
数据库标量函数映射 2.0
数据库表值函数映射 5.0
字段映射 1.1
可为空引用类型 (C# 8.0) 3.0
模型的图形可视化效果 未计划支持 (1)
图形模型编辑器 未计划支持 (1)
模型格式:EDMX (XML) 未计划支持 (1)
从数据库创建模型:VS 向导 未计划支持 (1)

正在查询数据

功能 EF6.4 EF Core
LINQ 查询 1.0
可读内容生成的 SQL 1.0
GroupBy 转换 2.1
加载相关数据:预先加载 1.0
加载相关数据:预先加载派生类型 2.1
加载相关数据:延迟加载 2.1
加载相关数据:显式加载 1.1
原始 SQL 查询:实体类型 1.0
原始 SQL 查询:无键实体类型 2.1
原始 SQL 查询:使用 LINQ 编写 1.0
显式编译的查询 2.0
await foreach (C# 8.0) 3.0
基于文本的查询语言(实体 SQL) 未计划支持 (1)

保存数据

功能 EF6.4 EF Core
更改跟踪:快照 1.0
更改追踪:通知 1.0
更改跟踪:代理 5.0
访问跟踪的状态 1.0
开放式并发 1.0
事务 1.0
批处理语句 1.0
存储过程映射 7.0
断开连接低级别 API 图形 1.0
断开连接端到端图形 1.0(部分;#5536

其他功能

功能 EF6.4 EF Core
迁移 1.0
数据库创建/删除 API 1.0
种子数据 2.1
连接复原 1.1
拦截器 3.0
事件 3.0(部分;#626
简单的日志记录 (Database.Log) 5.0
DbContext 池 2.0

数据库提供程序 (2)

功能 EF6.4 EF Core
SQL Server 1.0
MySQL 1.0
PostgreSQL 1.0
Oracle 1.0
SQLite 1.0
SQL Server Compact 1.0 (3)
DB2 1.0
Firebird 2.0
Jet (Microsoft Access) 2.0 (3)
Azure Cosmos DB 3.0
内存中(用于测试) 1.0

1 EF Core 中不会实现某些 EF6 功能。 这些功能依赖于 EF6 的基础实体数据模型 (EDM),并且/或者是复杂功能,投资回报率相对较低。 欢迎提出反馈,但是,尽管 EF Core 支持许多在 EF6 中无法实现的功能,反过来,EF Core 支持 EF6 的所有功能却并不可行。

2 更新到新的 EF Core 主版本时,第三方实现的 EF Core 数据库提供程序可能会延迟。 有关详细信息,请参阅数据库提供程序

3 SQL Server Compact 和 Jet 提供程序仅适用于 .NET Framework(而不适用于 .NET Core)。

受支持的平台

EF Core 3.1 通过使用 .NET Standard 2.0 在 .NET Core 和 .NET Framework 上运行。 但是,EF Core 5.0 确实可以在 .NET Framework 上运行。 有关更多详细信息,请参阅平台

EF6.4 通过多目标在 .NET Core 和 .NET Framework 上运行。

针对新应用程序的选择指南

除非应用需要仅在 .NET Framework 上受支持的内容,否则对于所有新应用程序都在 .NET Core 上使用 EF Core。

针对现有 EF6 应用程序的选择指南

EF Core 不是 EF6 的直接替换项。 从 EF6 迁移到 EF Core 可能需要更改应用程序。

将 EF6 应用迁移到 .NET Core 时:

  • 如果数据访问代码稳定且不太可能开发或需要新功能,请继续使用 EF6。
  • 如果数据访问代码不断演变,或应用需要仅在 EF Core 中提供的新功能,请迁移到 EF Core。
  • 迁移到 EF Core 通常也是为了提高性能。 但是,并非所有方案都可提高性能,因此请先进行分析。

有关详细信息,请参阅从 EF6 到 EF Core 的迁移