Entity Framework Core延期及弃用的特性

由于破坏了向后兼容性,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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSP页面EL表达式不解析

转载自 JSP页面EL表达式不解析问题是这样:在搭建springMVC环境的时候,笔者写了一个简单的Controller如下:Controller public class HelloController {RequestMapping(value "/hello.do", method RequestMethod.GET)public Strin…

将字符串String str= “abc god 中国 java“ 反转每个单词 结果: “cba dog 国中

/*** String str "abc god 中国 java"(较难) 反转每个单词结果: "cba dog 国中 avaj"**/ public class Demo2 {public static void main(String[] args) {String str …

netcore - MVC的ActionFilter的使用

经过一周的时间没有分享文章了,主要是在使用.netcore做一个小的项目,项目面向大众用户的增删改查都做的差不多了,打算本周在云服务器上部署试试,很期待,也希望上线后大家多多支持;以上纯属个人废话&#xf…

启动tomcat不出现命令窗口

转载自 启动tomcat不出现命令窗口 有个软件要安装在U盘中,B/S结构,用tomcat做应用服务器,客户要求tomcat不能注册为系统服务,启动时tomcat启动时不能出现命令行窗口,怎么实现?根据你的问题描述&#xff0c…

猜数字游戏 : 共给玩家10次机会,若第一次就猜对了,显示‘您真是个天才’,若10也没猜对,显示“您太笨了,下次努力吧!”, 若是第2-10次猜对了,只简单的显示:“恭喜您猜对了”。

猜数字游戏 : 共给玩家10次机会,若第一次就猜对了,显示‘您真是个天才’,若10也没猜对,显示“您太笨了,下次努力吧!”, 若是第2-10次猜对了,只简单的显示:“恭喜您猜对了…

Java:对double值进行四舍五入,保留两位小数的几种方法

转载自 Java:对double值进行四舍五入,保留两位小数的几种方法1. 功能 将程序中的double值精确到小数点后两位。可以四舍五入,也可以直接截断。 比如:输入12345.6789,输出可以是12345.68也可以是12345.67。至于是否需…

有一种陪伴不在身边,却在心间

内容来源:这里 有一种情,不求朝暮相见 只想在灵魂深处相偎 能多久,就多久 有一种朋友不在生活里 却在生命里 有一种陪伴不在身边 却在心间 每天在朋友圈都可以看到 你的行踪或心语 有空回复一下 感觉彼此就在面前,全心一笑…

NSubstitute完全手册索引

NSubstitute 是什么? NSubstitute 是一个 .NET 单元测试模拟类库。 一直以来,开发者对 mocking 类库的语法的简洁性有强烈的需求,NSubstitute 试图满足这一需求。简单明了的语法可以让我们将重心放在测试本身,而不是纠缠在测试替代…

如何彻底删除MySQL数据库(保姆级教学)

如何彻底删除MySQL数据库: 一、首先在控制面板删除你的MySQL数据库的部分安装 如图所示: 二、打开你的C盘,在Program Files 或者 Program Files(x86)里面找到有关MySQL的所有文件夹,并删除 如图所示&…

获取一个 Byte 的各个 Bit 值

转载自 获取一个 Byte 的各个 Bit 值1. bit:位 一个二进制数据0或1,是1bit;2. byte:字节 存储空间的基本计量单位,如:MySQL中定义 VARCHAR(45) 即是指 45个字节; 1 byte 8 bit3. 一…

Asp.net core中Migration工具使用的交流分享

一、文章参数 开发工具:visual studio 2015 community update 3 .net core tools(preview2) sqlserver2012 express开发环境:win10(版本14393) .net core(版本 1.0.0-preview2-003121)项目名称:AirMusic项目模板&…

BigDecimal类的使用

BigDecimal类的使用 一般常用的数据类型int和double类型但是在项目中我们会使用到大整数的处理类BigDecimal类 它有着自己的加减乘除和比较大小的方法 一、BigDecimal加减乘除的使用 1.加法 BigDecimal num1 new BigDecimal("10"); BigDecimal num2 new BigDe…

经典台词

内容来源:网络,侵删 01.满桌佳肴,你得有好牙;腰缠万贯,你得有命花。 02.赏一路风光,你得走得动;拣一座金山,你得能够拿。 03.垄沟里刨食的是条好汉子,病床上数钱的是个傻…

看了牛客网要发博客才好找工作,发篇冷静一下

看了牛客网要发博客才好找工作,发篇冷静一下

深入浅出 JIT 编译器

转载自 深入浅出 JIT 编译器JIT 简介 JIT 是 just in time 的缩写, 也就是即时编译编译器。使用即时编译器技术,能够加速 Java 程序的执行速度。下面,就对该编译器技术做个简单的讲解。 首先,我们大家都知道,通常通过 javac 将程…

org.springframework.uti包下的StringUtils的使用和org.apache.commons.lang包下StringUtils的使用

一、org.springframework.util.StringUtils StringUtils常用方法描述boolean isEmpty(Object str)判断字符串是否为空,如果为nul或者""则返回true,否则返回falseboolean hasLength(CharSequence str)判断字符串是否有长度,字符串不…

ASP.NET Core依赖注入解读amp;使用Autofac替代实现

1. 前言 关于IoC模式(控制反转)和DI技术(依赖注入),我们已经见过很多的探讨,这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection 模式》,相关资料链接都附于文章末…

Java 中的伪共享详解及解决方案

转载自 Java 中的伪共享详解及解决方案1. 什么是伪共享 CPU 缓存系统中是以缓存行(cache line)为单位存储的。目前主流的 CPU Cache 的 Cache Line 大小都是 64 Bytes。在多线程情况下,如果需要修改“共享同一个缓存行的变量”,就…

ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别

ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession() ActionContext.getContext().getSession(); 这个方法获取的session是struts封装过的一个Map类型的session,只能调用put()方法缓存数据。 ServletActionContext.getRe…

弯下腰,拾起你无价的尊严

内容来源于网络,侵删! 很久以前,一位挪威青年男子漂洋过海到了法国,他要报考著名的巴黎音乐学院。 考试的时候,尽管他竭力将自己的水平发挥到最佳状态,但主考官还是没能录取他。 身无分文的青年男子来到学…