最近很少去学习和探索新的东西,尤其是之前一直比较关注的EF领域,本身不太懒,但是苦于环境比较影响自身的心情,所以迟迟没有下笔,但是不去学习感觉在精神层面缺少点什么,同时也有园友说EF又更新了,要我再写一篇,最终经过思想斗争后,还是花了一点时间去继续探索。本篇比较理论的去分享最近EF进展,后面有时间会继续关注EF团队在EF上的动向,并给出相对应的实例。
(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代码库中得到实现。
如下特性已经实现并且已经包含在官方最后一次正式发布之前。注意:【如下列出的特性可能存在Bugs可能需要EF团队时间去解决并且这些APIs在第一次正式发布之前仍然可能会有所改变。】
(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):允许实体被映射到表中的列。
(1)快照式变更追踪(Snapshot change tracking):当与数据库中进行交互时记录实体的原始值。
(2)访问跟踪状态(Access tracked state):通过DbContext.Entry和DbContext.ChangeTracker访问实体的状态。
(3)附加分离的实体图/(Attach detached entities/graphs):为了保存新的实体或者修改的实体,通过DbContext.AttachGraph的APIs将实体附加到上下文中。
(1)基本的保存功能(Basic save functionality):将改变的实体与数据库处于同步状态。
(2)乐观并发(Optimistic Concurrency):防止当从数据库中获取数据时,数据被其他用户所覆盖。
(3)异步保存(Async SaveChanges):当调用SaveChanges时数据库需要作出相应的操作,此时释放当前线程,来处理SaveChanges发出的命令。
(4)事务(Transactions):当SaveChanges时是原子性即要么提交全部成功或者对数据库数据没有作出任何改变,对于transactions有相关的APIs来使得在同一个上下文实例中共享transactions。
(5)批处理语句(Batching statements):通过批处理多个INSERT/UPDATE/DELETE命令到单一的往返到数据库提供更好的性能。
(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组成。
(1)创建和删除数据库的APIs(Database creation/deletion)APIs:主要是为了在没有使用数据迁移的前提下快速创建和删除数据库。
(2)数据库错误页(Database error page):是对于ASP.NET 5的一个中间件,为了提供与数据库有关异常的帮助。
(3)有关数据库迁移(Relational database migrations):允许数据库架构随着模型的变化而变化。
(1)EntityFramework.SqlServer:连接Microsoft SQL Server 2008以上的数据库。
(2)EntityFramewrok.Sqlite:连接一个SQL Lite 3数据库。
(3)EntityFramework.InMemory: 并没有连接到一个真正的数据库主要是被用来测试。
(1)所有.NET(Full .NET):包括控制台、WPF、WinForm、ASP.NET 4等等。
(2)ASP.NET 5:包括所有.NET和.NET Core。
(3)所有Windows平台(UWP):应用程序可以利用SQLite来访问本地数据。
以下特性正在实现中,在某些场景下可能有效,可能还不太完整使用起来仍有一些限制。
(1)数据注入(Data Annotaions):添加特性到实体类或者属性以此来影响到实体。
(2)TPH继承模式(TPH inheritance pattern):通过数据库中给定的记录中的辨别字段来识别在继承上的实体类型并保存到一个单表中。
(1)文档(Documentation):将发展有关EF Core的文档【链接:EntityFramework.Docs】
(2)智能提示文档(IntelliSense documentation):当在Visual Studio中使用EF APIs时会得到智能提示。
(3)以往APIs(APIs review):由于涉及到以前的EF APIs,所以将会给出一份干净而且一致的APIs。
(1)附加覆盖(Additional converage):通过测试组件可能会有额外的覆盖。
(2)性能改善(Performance improvements):性能瓶颈正在进行中。
导航属性翻译(Navagation property translation):允许通过LINQ直接点出导航属性的字段,如(Products.Where(p=>p.Category.name=="cnblogs"))。
允许从现有的关系数据库架构逆向得到EF模型。
EF Core当前可以在苹果和Linux上工作,但是正在向更稳定的方向上提高。
在1.0.0发布之前以下已经得到实现,但是现在还未正式启用。
(1)允许(如迁移)工具找到上下文类型并实例化来创建模型和识别连接其连接的数据库。
(2)为一般应用部署时,部署数据库发生的改变提供更好的支持。
(3)提供当父亲删除时其孩子也应该删除的级联删除。
(4)在ASP.NET 5中初始化版本日志记录比较简单,为了后续记录的更新提供更友好的日志记录。
EF Core将是EF团队推荐使用的EF版本,但是有一个前提,那就是还需实现如下特性EF Core才是许多应用程序的最佳选择,特别是在例如UWP平台上EF 6.x无法工作,当然了对于绝大数应用程序来说,缺少以下特性也同样使得EF 6.x是个不错的选择。
(1)显示加载(Explicit loading)。
(2)子查询(Sub queries)。
(3)将Group by转换为SQL(Group by translation SQL)。
(1)良好的日志记录。
(2)结构化日志记录。
复杂/值类型(Complex/value Type)。
从数据库中更新数据模型。
(1)补充在EF6.x中缺少的APIs(如:Reload【重新加载】、GetModifiedProperties【获取修改的属性】等等)。
(2)对于关系的Entry方法。
(3)对于数据库值的Entry方法。
(1)基于存储过程的CUD。
(2)弹性连接。
尽管在上述对于未实现特性已经列出了一个清单,但是对于绝大多数应用程序来说,因为没有这些高优先级特性,正因如此使得EF Core将是一个比较令人拍手叫好的发布版本。
(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)。
通知变更追踪(Notification change tracking)。
(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)。
(1)ATS。
(2)Redis。
(3)其他非关系数据库。
基于公共语言架构的非DNX项目。
通过配置文件指定提供者。
EF Core原名为EntityFramework 7,至于更名大概主要有两点,一是为了更好的跨平台,二是为了提高EF的性能。从而给开发者更好的使用体验以及让更多的.NET开发者去使用EF Core,上述也已经讲到,EF Core会更加轻量同时也会更多的去关注它的性能瓶颈,至此或许关于EF性能的吐槽会少一点吧,让我们拭目以待。