由于破坏了向后兼容性,Entity Framework的名声相当不光彩,但与Entity Framework Core的完全重写相比就相形见绌了。在本文中,InfoQ将着眼于其中部分主要特性的变化及其影响。

延期及弃用的特性

首先,我们将看下那些EF Core 1.0没有支持并且也不在EF Core 1.1路线图上的EF 6特性。

延迟加载

一般来说,对于Entity Framework和ORM而言,延迟加载一直是一个备受争议的问题。EF最初就不应该支持延迟加载,因为它很容易被误用,而且经常导致性能问题。

不过,在性能不是很重要的情况下,比如快速原型和实用工具,延迟加载还是非常有用的。因此,第二个主要版本EF 4增加了这一特性。(注意:为了与.NET Framework的版本号保持一致,EF跳过了版本2和3。)

EF Core没有提供延迟加载,这让一些人欢呼,也让其他人错愕。目前的建议是等待EF Core 1.1,到时候,他们“可能会允许你推出自己的延迟加载。”根据GitHub及其他地方的各种讨论,还不清楚他们是否会直接支持它。

GROUP BY转译

这一点令人难以理解。虽然LINQ to SQL在10年前就提供了支持,但EF Core的路线图上并没有GROUP BY支持。这意味着,如果你的查询中包含分组操作,EF Core将在查询生成的时候忽略GROUP BY子句。

显而易见的结果是,这将极大地增加网络带宽要求,因为所有的底层数据都需要在聚合之前移到中间层。反序列化额外的数据也是有开销的,而且,在执行实际的分组操作时,C#的效率很有可能比数据库低。(数据库的优势是可以使用表的统计信息,如表的大小和分布,确定使用的最佳算法。)

存储过程

微软另一个让人吃惊的举措是不支持存储过程。虽然从技术上讲你仍然可以使用原始SQL访问它们,但那有许多限制。

  • SQL查询只能用于返回作为模型组成部分的实体类型。[该特性计划在.NET Core 1.1中提供。]

  • SQL查询必须为实体类型的所有属性返回数据。

  • 结果集中的列名必须与属性映射的列名相匹配。注意,这点和EF6.x不同。在EF6.X中,在使用原始SQL查询时,属性/列映射会被忽略,结果集列名必须和属性名匹配。

  • SQL查询不能包含关联数据。然而,在许多情况下,你可以使用Include操作符组合查询返回关联数据(参见“包含关联数据”)。

在某些情况下,你可以将原始SQL和LINQ表达式混合,比如向表-值函数查询添加Where或OrderBy调用。

空间数据类型

空间数据类型的情况比较有趣。当直接使用ADO.NET时,他们希望开发人员使用随SQL Server提供的、作为COM库(Microsoft.SqlServer.Types)封装器的空间类型。由于COM不能很好地与.NET融合,尤其是在库的分发和注册要求方面,所以Entity Framework平行开发了自己的空间类型(System.Data.Spatial)集。这两种API都是以开放地理空间联盟(OGC)规范为基础,因此在基本功能方面非常相似。

目前为止,我们讨论的内容主要和SQL Server相关。其他数据库会有其他的空间类型实现。因此,就可以理解,微软为什么正在花时间设法解决这个问题。

种子数据

虽然EF Core支持数据库迁移,但不支持操作种子数据查找表。

简单命令拦截

命令拦截广泛应用于消除Entity Framework SQL生成器的局限。例如,如果你希望在EF中使用全文搜索,则需要实现IDbCommandInterceptor接口,并重写ReaderExecuting/ScalarExecuting方法。

这项技术相当复杂,而且严重依赖于确切地知道EF会生成什么SQL。但是,没有这项技术,数据库的许多高级特性都无法使用了。

工具

之前的文章中已经提到过,最初随LINQ to SQL和Entity Framework提供的图形建模工具不会出现在EF Core中。

而且,目前没有计划提供从数据库更新模型的能力。在可预见的未来,从数据库生成模型仍然会是一个一次性事件。

EF Core 1.1的特性

EF Core 1.1有望在明年1季度发布,除了Bug修复外,还包含以下特性。

改进转译

这个麻烦的标题缺少细节信息。它只是介绍说,“让更多的查询成功执行,在数据库(而不是内存)中进行更多的逻辑求值。”它还介绍说,EF 6支持“简单”、“中等”和“复杂”查询。EF Core的中等查询已经“稳定”,复杂查询支持还在开发中。

关于涵盖哪些场景的线索很少,所以开发人员需要格外仔细地检查生成的SQL,并分析它们的数据库调用,以确保EF行为正常。

类似地,使用了导航属性的查询被认为仍处于开发中。

查询非模型类型

如上文所述,EF Core 1.1有望能够物化不是模型组成部分的类型。

DbSet.Find

这是EF 5提供的一个方便的方法,用于通过主键加载记录,无需显式指定名称。它钩入上下文缓存,因此避免了不必要的数据库调用。它还可以找到已经附加到上下文但尚未保存到数据库(前提是你没有使用identity/auto-number列)的记录。

EntityEntry/ObjectStateEntry APIs

更多EntityEntry及ObjectStateEntry特性,如Reload、GetModifiedProperties、GetDatabaseValues,同样也在计划里。

显式加载

不要同“主动加载”混淆,显式加载允许将子集合加载到已经物化的实体中。可以将它看成是延迟加载外加一个额外的步骤。

连接恢复能力

这是一个很有前景的特性,它会自动重试因为连接问题导致失败的事务。“这在连接到SQL Azure时特别有用,在那种情况下,瞬时错误很常见。”

EF Core下一个版本的特性

虽然预计不会在EF Core 1.1的时间框架内完成,但有些其他的特性正在准备中:

  • 复杂/值类型是没有主键的类型,用于表示实体类型上的一组属性;

  • 简单类型转换,如string=>xml;

  • 从已有的数据库进行模型逆向工程的Visual Studio向导。

原文地址:http://www.infoq.com/cn/news/2016/08/EF-Core-Roadmap


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

Entity Framework Core延期及弃用的特性相关推荐

  1. 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

    在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...

  2. Entity Framework Core 2.0的新特性

    虽然EF Core 2.0存在大量槽点,但是它也给出了不少亮点.在本文中,我们将介绍这次发布版的部分亮点. \\ 数据库表切分(Table Splitting) \\ ORM常被吐槽是总是对所请求数据 ...

  3. ABP官方文档翻译 9.2 Entity Framework Core

    Entity Framework Core 介绍 DbContext 配置 在Startup类中 在模块PreInitialize方法中 仓储 默认仓储 自定义仓储 应用程序特定基础仓储类 自定义仓储 ...

  4. Entity Framework Core 2.0 使用入门

    本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...

  5. Entity Framework Core介绍(1)

    介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...

  6. oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  7. Entity Framework Core 6.0 预览4 性能改进

    起因 微软在Build2021开发者大会上,发布Entity Framework Core 6.0(简称EFCore 6)预览第四版,号称是性能版本,性能提升主要对于Entity Framework  ...

  8. Entity Framework Core 5中实现批量更新、删除

    本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新.删除数据的开发包,并且分析了其实现原理,并且与其他实现方案做了比较. 一.背景 随着微软全 ...

  9. Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令

    在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...

最新文章

  1. [Java] 基本資料包裝類別 Wrapper Classes
  2. Chipseq数据库的建立
  3. windows 检测无键鼠操作时间_HP快速卡简易操作流程
  4. 安装错误 服务尚未启动_原创 | 西门子300软件安装出错处理大全
  5. 微信JSAPI支付,报错当前页面的URL未注册
  6. 11月12号 用户登录输入密码错误达到指定次数后,锁定账户 004
  7. 枚举项的数量限制在64个以内
  8. C#LeetCode刷题之#119-杨辉三角 II(Pascal‘s Triangle II)
  9. django excel 导出页面_Django Admin中增加导出Excel功能过程解析
  10. MySQL48道经典基础面试题(包含各个方面)
  11. delphi编程来记录QQ的聊天记录
  12. 第三章 虚拟化概述(处理器虚拟化)
  13. 关于Arduino下载并添加DHT11库文件的详细教程
  14. GIS520论坛,GIS专业资源下载!
  15. 小米手机第三方卡刷软件_小米手机MIUI卡刷图文教程
  16. php 405,http 405错误是什么 http 405错误怎么解决
  17. 网络上各种指数 总结 收集
  18. vue 组件自己不能删除自己,$destroy从组件树上删除+从视图上消失
  19. 压缩文件报错 tar: Exiting with failure status due to previous errors
  20. <二> objectARX开发:创建和编辑基本图形对象

热门文章

  1. ylbtech-Model-Account(通用账户模块设计)
  2. mysql cmake 参数详解
  3. session、cookie、隐藏域、url参数传递四种会话及跟踪方式
  4. 单元测试 | 如何Mock IHttpClientFactory
  5. ASP.NET Web API中实现版本
  6. 如何捕获 EF 生成的 SQL 脚本?
  7. 小米开招.NET,20~40k*16薪,点名要求WPF+自动化!
  8. foreach和IEnumerable+yield和IEnumerator
  9. MIPS投RISC-V是龙芯新征程的开始
  10. 你见过的“垃圾”项目是这样子么?