配置数据库连接
与不同数据源相比,EF6 连接到各种数据源EF Core。 移植代码时,必须了解它们。
- 连接字符串:EF Core不像 EF6 一样直接支持不同连接字符串的多个构造函数重载。 相反,它依赖于 DbContextOptions。 仍可在派生类型中提供多个构造函数重载,但需要通过选项映射连接。
- 配置和缓存:EF Core支持使用可连接到外部服务提供商的内部基础结构实现更可靠、更灵活的依赖项注入。 这由应用程序管理,以处理必须刷新缓存的情况。 EF6 版本受到限制,无法刷新。
- 配置文件:EF6 支持通过配置文件(可以包含提供程序)进行配置。 EF Core需要直接引用提供程序程序集和显式提供程序注册 (即)
UseSqlServer
。 - 连接工厂:EF6 支持的连接工厂。 EF Core不支持连接工厂,并且始终需要连接字符串。
- 日志记录:通常 ,登录EF Core 更可靠,并且有多个选项用于微调配置。
约定
EF6 支持的自定义 ("轻型") 约定和模型约定。 轻型约定类似于EF Core 约定模型配置。 其他约定作为模型构建的一部分受到支持。
EF6 在生成模型后运行约定。 EF Core在生成模型时应用它们。 在EF Core中,可以将模型生成与使用 DbContext 的活动会话分离。 可以创建使用约定初始化的模型。
数据验证
EF Core不支持数据验证,并且仅使用数据注释来生成模型和迁移。 从 Web/MVC 到 WinForms 和 WPF 的大多数客户端库都提供了一个数据验证实现来使用。
即将推出的功能
EF6 中的一些功能尚不存在于EF Core,但位于产品路线图中。
- EF6 支持每个具体 (TPC ) 以及"实体拆分"。TPC 位于 EF7 的路线图中。
- EF6 中的存储 过程映射允许将创建、更新和删除操作委托给存储过程。 EF Core仅允许映射到存储过程进行读取。 EF7 的路线图中 (、更新) CUD 支持。
- EF6 中的复杂类型类似于 EF6 中的EF Core。 但是,EF7 中的值对象将处理完整的功能集。
将 ObjectContext 保留为隐藏状态
EF Core使用 DbContext 而不是 ObjectContext
。 必须更新使用 IObjectContextAdapter 的代码。 这有时用于具有 或 合并选项 PreserveChanges
的 OverwriteChanges
查询。 有关 EF Core类似的功能,请看 一下 Reload 方法。
模型配置
EF6 和 EF Core 模型的设计EF Core差异。 EF Core条件映射的完全支持。 它没有模型生成器版本。
其他差异包括:
类型发现
在EF Core中,引擎通过三种方式发现实体类型:
DbSet<TEntity>
在 上公开DbContext
,TEntity
其中 是想要跟踪的类型。- 从代码中
Set<TEntity>
的某一位置引用 。 - 发现的类型引用的复杂类型以递归 (例如
Blog
Post
Blog
Post
,如果引用 和 是可发现的,则 也会发现)
不会扫描 派生 类型的程序集。
映射
EF6 .Map()
中的扩展已替换为中重载和扩展EF Core。 例如,可以使用 "。HasDiscriminator () ' ,用于通过 TPH (配置) 。
继承映射
EF6 支持每层次结构表 (TPH) 、每类型表 (TPT) 和表每具体类 (TPC) ,并启用了层次结构不同级别不同风格混合映射。 EF Core TPT 或 TPH (对继承链进行单向建模) 计划是在 EF7 中添加对 TPC 的支持。
属性
EF6 支持的属性索引属性。 在EF Core中,它们在类型级别应用,这应该可以简化需要组合索引的方案。 EF Core不支持包含数据注释的复合键 (即将 Order in ColumnAttributeKeyAttribute
与) 。
必需和可选
在EF Core中, IsRequired
仅配置主体端所需的 。 HasForeignKey
现在配置主体端。 若要移植代码,改为使用 会更加 .Navigation().IsRequired()
简单。 例如:
EF6:
modelBuilder.Entity<Instructor>()
.HasRequired(t => t.OfficeAssignment)
.WithRequiredPrincipal(t => t.Instructor);
EF Core 6:
modelBuilder.Entity<Instructor>()
.HasOne(t => t.OfficeAssignment)
.WithOne(t => t.Instructor)
.HasForeignKey<OfficeAssignment>();
modelBuilder.Entity<Instructor>()
.Navigation(t => t.OfficeAssignment)
.IsRequired();
modelBuilder.Entity<OfficeAssignment>()
.Navigation(t => t.Instructor)
.IsRequired();
默认情况下,所有内容都是可选的,因此通常不需要调用 .IsRequired(false)
。
空间支持
EF Core第三方库社区库 NetTopologySuite 集成以提供空间支持。
独立关联
EF Core不支持独立关联 (EDM 概念,该概念允许独立于实体本身定义两个实体之间的关系) 。 卷影属性是EF Core 概念。
迁移
EF Core不支持数据库初始值设置或自动迁移。 尽管此包EF Core migrate.exe
,但可以生成 迁移捆绑包。
Visual Studio工具
EF Core没有设计器,没有从数据库更新模型的功能,也没有模型第一流。 没有反向工程向导,也没有内置模板。
尽管这些功能不随 EF Core一起提供,但存在提供其他工具的 OSS 社区项目。 具体而言, EF Core Power Tools 提供:
- 从内部进行反向Visual Studio,支持数据库项目 ()
.dacpac
。 包括基于模板的代码自定义。 - 使用模型图形和脚本对 DbContext 进行可视化检查。
- 使用 GUI 管理Visual Studio内部迁移。
更改跟踪
EF6 和 EF Core更改跟踪存在一些差异。 这些项的概述详见下表:
功能 | EF6 | EF Core |
---|---|---|
实体状态 | 添加/附加整个关系图 | 支持导航到分离的实体 |
项 | 已保留 | Deleted |
断开连接,自跟踪实体 | 支持 | 不支持 |
突变 | 对属性执行 | 在支持字段上执行 * |
数据绑定 | .Local | .Local 加号 .ToObservableCollection 或 .ToBindingList |
更改检测 | 完整图形 | 每个实体 |
* 默认情况下,将不会在 EF Core 中触发属性通知,因此 配置通知实体很重要。
请注意,EF Core 不会在 EF6 的情况下自动调用更改检测。
EF Core 介绍了更改跟踪器的详细信息 DebugView
。
查询
EF6 包含 EF Core 中不存在的一些查询功能。 其中包括:
- 一些常见的 c # 函数和 SQL 函数映射。
- 截获查询和更新的命令目录树。
- 支持 (Tvp) 的表值参数。
EF6 对延迟加载代理提供内置支持。 这是一个用于 EF Core 的可选包 。
EF Core 允许你使用 FromSQL
对原始 SQL 进行组合。