前言

最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要我再写一篇,最终经过思想斗争后,还是花了一点时间去继续探索。本篇比较理论的去分享最近EF进展,后面有时间会继续关注EF团队在EF上的动向,并给出相对应的实例。

EF Core 1.0.0

(1)EntityFramework是微软在.NET中推荐使用的数据访问技术,而EntityFramework Core提供了和EF6.x相似的开发者体验,它也支持LINQ、POCO以及Code First,它也能访问关系和非关系存储的数据,但是EF Core比之前的EF版本更加轻量。与此同时,在一开始被构建时就被应用的非常好比如在使用ASP.NET vNext上使用的设备如:Windows应用程序,当然在传统的.NET领域也是如此。

————————————————————————————————————————————————————————————————

(2)但是我们需要注意的是EF Core在严格意义上并未完全和ASP.NET Core捆绑在一起,并且EF Core有许多特性是在ASP.NET使用范畴之外。它是ASP.NET Core整体的一部分,因此作为ASP.NET Core的部分去发布一个稳定的EF Core版本去支持ASP.NET Core确实非常重要。

————————————————————————————————————————————————————————————————

(3)因为EF Core是一个新的代码库,所以在过去EF版本中实现的特性并不一定会在EF Core中实现,所以鉴于此,EF团队给出了在EF Core发布之前需要实现的如下的列表,同时也列出了EF团队认为非常重要且需要实现的特性,但是,但是,在初始发布EF Core时将并不会启用。所以这也就意味着:当前在大多数应用程序中使用EF 6.x版本仍然是最佳选择,直到这些特性在EF Core代码库中得到实现。

已实现(Implemented)

如下特性已经实现并且已经包含在官方最后一次正式发布之前。注意:【如下列出的特性可能存在Bugs可能需要EF团队时间去解决并且这些APIs在第一次正式发布之前仍然可能会有所改变。】

模型(Modeling)

(1)基础模型(Basic modeling):基于带get/get属性的POCO实体。公共属性来自于基础类库如(string、int等)。

(2)关系(Relationship):有导航属性和外键属性的实体。

(3)隐藏状态属性(Shadow state properties):此属性只是作为模型的一部分,也就是说在CLR类中没有与之对应的属性。

(4)唯一性约束和索引(Unique constraints an indexes):定于目标的唯一性约束是否是主键的关系。

(5)内置约定(Built-in conventions):构建实体类的初始化模型。

(6)模型验证(Model validations):检测模型中无效的模式,并提供有帮助的错误信息。

(7)键值的产生:包括后台以及数据库中生成的。

(8)关系(Relationnal):允许实体被映射到表中的列。

变更追踪(Change Tracking)

(1)快照式变更追踪(Snapshot change tracking):当与数据库中进行交互时记录实体的原始值。

(2)访问跟踪状态(Access tracked state):通过DbContext.Entry和DbContext.ChangeTracker访问实体的状态。

(3)附加分离的实体图/(Attach detached entities/graphs):为了保存新的实体或者修改的实体,通过DbContext.AttachGraph的APIs将实体附加到上下文中。

保存(SaveChanges)

(1)基本的保存功能(Basic save functionality):将改变的实体与数据库处于同步状态。

(2)乐观并发(Optimistic Concurrency):防止当从数据库中获取数据时,数据被其他用户所覆盖。

(3)异步保存(Async SaveChanges):当调用SaveChanges时数据库需要作出相应的操作,此时释放当前线程,来处理SaveChanges发出的命令。

(4)事务(Transactions):当SaveChanges时是原子性即要么提交全部成功或者对数据库数据没有作出任何改变,对于transactions有相关的APIs来使得在同一个上下文实例中共享transactions。

(5)批处理语句(Batching statements):通过批处理多个INSERT/UPDATE/DELETE命令到单一的往返到数据库提供更好的性能。

查询(Query)

(1)支持基础LINQ(Basic LINQ Support):提供LINQ处理来自数据库的数据。

(2)混合的客户端或者服务器端评估(Mixed client/server evaluation):让查询包含不会在数据库中进行任何评估的逻辑,与此同时,从数据库中返回到内存的数据必须被评估。

(3)不会追踪(No Tracking):当上下文不需要监控实体实例的改变时(也就是说当我们只是读取数据时),此时将启用快速查询。

(4)饥饿加载(Eager loading):当查询关联的数据时通过使用Include和ThenInclude方法来标识这些相关联的数据需要被加载。

(5)异步查询(Async Query):当数据库处理查询时释放当前线程来处理其他请求。

(6)常见的BCL翻译功能(Translation of common BCL functions):当使用LINQ时,启动这些功能语句将会被翻译成特定的数据库查询语言。

(7)原始SQL查询(Raw SQL Query):提供Dbset.FormSql来使用原始SQL查询来获取数据。当然这些查询也可以用LINQ组成。

数据库架构管理(Database schema management)

(1)创建和删除数据库的APIs(Database creation/deletion)APIs:主要是为了在没有使用数据迁移的前提下快速创建和删除数据库。

(2)数据库错误页(Database error page):是对于ASP.NET 5的一个中间件,为了提供与数据库有关异常的帮助。

(3)有关数据库迁移(Relational database migrations):允许数据库架构随着模型的变化而变化。

提供的数据库(Database providers)

(1)EntityFramework.SqlServer:连接Microsoft SQL Server 2008以上的数据库。

(2)EntityFramewrok.Sqlite:连接一个SQL Lite 3数据库。

(3)EntityFramework.InMemory: 并没有连接到一个真正的数据库主要是被用来测试。

平台(Plateforms)

(1)所有.NET(Full .NET):包括控制台、WPF、WinForm、ASP.NET 4等等。

(2)ASP.NET 5:包括所有.NET和.NET Core。

(3)所有Windows平台(UWP):应用程序可以利用SQLite来访问本地数据。

进行中(In Progress)

以下特性正在实现中,在某些场景下可能有效,可能还不太完整使用起来仍有一些限制。

模型(Modeling)

(1)数据注入(Data Annotaions):添加特性到实体类或者属性以此来影响到实体。

(2)TPH继承模式(TPH inheritance pattern):通过数据库中给定的记录中的辨别字段来识别在继承上的实体类型并保存到一个单表中。

跨领域性质(Cross-cutting quality)

(1)文档(Documentation):将发展有关EF Core的文档【链接:EntityFramework.Docs

(2)智能提示文档(IntelliSense documentation):当在Visual Studio中使用EF APIs时会得到智能提示。

(3)以往APIs(APIs review):由于涉及到以前的EF APIs,所以将会给出一份干净而且一致的APIs。

性能(Performance)

(1)附加覆盖(Additional converage):通过测试组件可能会有额外的覆盖。

(2)性能改善(Performance improvements):性能瓶颈正在进行中。

查询(Query)

导航属性翻译(Navagation property translation):允许通过LINQ直接点出导航属性的字段,如(Products.Where(p=>p.Category.name=="cnblogs"))。

逆向工程(Reverse engineer)

允许从现有的关系数据库架构逆向得到EF模型。

平台(Plateforms)

EF Core当前可以在苹果和Linux上工作,但是正在向更稳定的方向上提高。

EF Core 1.0.0日程表

在1.0.0发布之前以下已经得到实现,但是现在还未正式启用。

(1)允许(如迁移)工具找到上下文类型并实例化来创建模型和识别连接其连接的数据库。

(2)为一般应用部署时,部署数据库发生的改变提供更好的支持。

(3)提供当父亲删除时其孩子也应该删除的级联删除。

(4)在ASP.NET 5中初始化版本日志记录比较简单,为了后续记录的更新提供更友好的日志记录。

未实现特性(Backlog Features)

EF Core将是EF团队推荐使用的EF版本,但是有一个前提,那就是还需实现如下特性EF Core才是许多应用程序的最佳选择,特别是在例如UWP平台上EF 6.x无法工作,当然了对于绝大数应用程序来说,缺少以下特性也同样使得EF 6.x是个不错的选择。

查询(Query)

(1)显示加载(Explicit loading)。

(2)子查询(Sub queries)。

(3)将Group by转换为SQL(Group by translation SQL)。

日志(Logging)

(1)良好的日志记录。

(2)结构化日志记录。

模型(Modeling)

复杂/值类型(Complex/value Type)。

更新模型(Update model)

从数据库中更新数据模型。

变更追踪(Change Tracking)

(1)补充在EF6.x中缺少的APIs(如:Reload【重新加载】、GetModifiedProperties【获取修改的属性】等等)。

(2)对于关系的Entry方法。

(3)对于数据库值的Entry方法。

特定关系(Relational specific)

(1)基于存储过程的CUD。

(2)弹性连接。

高优先级特性(High priority features)

尽管在上述对于未实现特性已经列出了一个清单,但是对于绝大多数应用程序来说,因为没有这些高优先级特性,正因如此使得EF Core将是一个比较令人拍手叫好的发布版本。

模型(Modeling)

(1)隐藏状态实体(Shadow state entities)。

(2)映射到方法、可能的属性模式、不可变对象等等。

(3)可视化模型(Visualize model)。

(4)支持可组合的功能(Composable functions support)。

(5)自定义约定(Custom conventions)

(6)实体或者表拆分(Entity/Table splitting)。

(7)简单类型转换(比如从string->xml)。

(8)没有添加实体的多对多关系(many:many relationships without join entity)。

变更追踪(Change Tracking)

通知变更追踪(Notification change tracking)。

增删改查(CRUD)

(1)基本数据保存(Seed data)。

(2)延迟加载(Lazy loading)【根据反馈来看】。

(3)简单的ETag式并发令牌支持(Simple ETag-style concurrency token support)。

(4)饥饿加载改善(Eager loading)【比如:汇总、过滤、派生类等等】。

(5)用于查询和更新的简单拦截机制(Simple interception mechanisms for query and updates)。

提供者(Providers)

(1)ATS。

(2)Redis。

(3)其他非关系数据库。

迁移(Migrations)

基于公共语言架构的非DNX项目。

指定提供者(Provider specific)

通过配置文件指定提供者。

结语

EF Core原名为EntityFramework 7,至于更名大概主要有两点,一是为了更好的跨平台,二是为了提高EF的性能。从而给开发者更好的使用体验以及让更多的.NET开发者去使用EF Core,上述也已经讲到,EF Core会更加轻量同时也会更多的去关注它的性能瓶颈,至此或许关于EF性能的吐槽会少一点吧,让我们拭目以待。

EntityFramework 7 更名为EntityFramework Core(预发布状态)的更多相关文章

  1. 你必须知道的EntityFramework 6.x和EntityFramework Core变更追踪状态

    前言 只要有时间就会时不时去看最新EF Core的进展情况,同时也会去看下基础,把握好基础至关重要,本节我们对比看看如标题EF 6.x和EF Core的不同,希望对正在学习EF Core的同行能有所帮 ...

  2. EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?

    前言 本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印. EntityFramework 6.x和E ...

  3. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  4. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  5. jenkins 实现测试发布、预发布、真实发布、回滚发布

    主要思路: 1.做三个文件夹,用于放置不可随意修改的配置文件(测试发布.预发布.真实发布) 2.每次都先修改配置文件再进行构建(构建时会先把配置文件复制到构建的目录,再同步到发布的目录) 3.发布完代 ...

  6. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  7. [转]EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    本文转自:http://www.cnblogs.com/VolcanoCloud/p/5572408.html 官方文档英文地址:https://github.com/aspnet/EntityFra ...

  8. EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?

    前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...

  9. EntityFramework 6.x和EntityFramework Core插入数据探讨

    前言 一直以来对EF和EF Core都是单独分开来写,从未以比较的形式来讲解,如果您既用过EF 6.x也用过用EF Core是否有了解过EF和EF Core在插入数据时和返回主键有何异同呢?本篇博客是 ...

随机推荐

  1. 根据异常处理对 Java 方法的层次分类

    我根据异常处理对 Java 的方法分为三个层次:1.执行层,2. 处理层,3. 调用层. 执行层方法只抛出异常 throws Exception,是作为代码的基层操作者,可能有多个层次. 处理层方法使 ...

  2. 基础2.通过Ajax获得servlet数据(最基础)

    案列一:从服务器的得到输出的数据 Jsp界面 <script type="text/javascript" src="test.js"></s ...

  3. C#SerialPort如何读取串口数据并显示在TextBox上

    SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...

  4. redis 的理解

    1.Redis使用 C语言开发的.Redis 约定此版本号,为偶数的版本是稳定版(如:2.4版 2.6版),奇数版是非稳定版(如:2.5版 2.7版) 2.Redis 数据库中的所有的数据都存储在内存 ...

  5. fft练习

    数学相关一直都好弱啊>_< 窝这个月要补一补数学啦, 先从基础的fft补起吧! 现在做了 道. 窝的fft 模板 (bzoj 2179) #include <iostream> ...

  6. 在线图片压缩后以ImageIO 流的形式 设置大小显示指定页面

    1.Servlet   代码 public class ZoomImgServlet extends HttpServlet implements Servlet { public void init ...

  7. VIPM 发布功能总结

    前言 上一篇中,我们分析介绍了LabVIEW自带的安装发布功能,今天总结一下VIPM的发布功能.   VIPM 提到LabVIEW,不能不提VI Package Manager (VIPM)这个工具包 ...

  8. *HDU 1392 计算几何

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. 学习笔记——SQLite介绍

    简介:Google为android的较大数据的处理提供了SQLlite, 他在数据存储.管理.维护.等各方面都相当出色功能也非常强大. 1.创建数据库 Android 为了让我们能够更加方便地管理数据 ...

  10. SQL Server : Browser服务

    SQL Server : Browser服务是SQL Server 2005新增的,简单的说,如果一个物理服务器上面有多个SQL Server实例,那么为了确保客户端能访问到正确的实例,所以SQL S ...