从 EF6 移植到 EF Core 时要考虑的详细情况

内容纲要

配置数据库连接

与不同数据源相比,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> 的某一位置引用 。
  • 发现的类型引用的复杂类型以递归 (例如 BlogPostBlogPost ,如果引用 和 是可发现的,则 也会发现)

不会扫描 派生 类型的程序集。

映射

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更改跟踪存在一些差异。 这些项的概述详见下表:

功能EF6EF 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 进行组合。

给TA打赏
共{{data.count}}人
人已打赏
.NET

将基于 EF6 EDMX 的模型移植到 EF Core

2022-6-22 10:14:20

.NET

将基于 EF6 代码的模型移植到 EF Core

2022-6-22 10:22:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索