Entity Framework7简称EF7,是微软正在开发的最新的在.NET应用中首选的数据访问技术。它是轻量级和可扩展的启用新的平台和新的数据存储的实体框架版本。以下的应用: Windows Phone、 Windows 应用商店,ASP.NET 5 和传统的桌面应用程序,现在都可以利用的实体框架。EF7除了支持关系型数据库, 还支持如 Azure 表和Redis非关系型数据存储。
从上面我们可以看到以下几个重点:
1、EF7跟之前版本一样,仍然是一项数据访问技术;
2、EF7是一个轻量的可扩展的的实体框架;轻量是相较之前的版本,之前的版本因为众多的遗留问题(比如上下文对象就有ObjectContext和DbContext两个版本)和之前设计上的一些问题,已经非常复杂和庞大了,其中包含了使用上的复杂性。EF7是一次重大的变革,微软决定从头重构它;
3、EF7支持非关系数据存储了;
二、Entity Framework7有什么不同1、与之前的版本有哪些是相同的?
使用它时,顶层的接口跟之前的版本基本相同,
a、你仍然可以继承DbContext上下文对象,上下文中仍有DbSet<Tentity>属性;
b、你仍然可以在DbSet属性上使用Linq来编写查询;
c、你仍然可以使用DbSet属性上的Add和Remove方法;
d、你仍然可以使用DbContext.ChangeTracker和DbContext.Database属性访问对象跟踪和调用数据库相关的api;
例如:下面的代码在EF6.x和EF7中写法一样
1 using (var db = new BloggingContext()) 2 { }); 4 db.SaveChanges(); blogs = from b in db.Blogs.Include(b => b.Posts) 7 orderby b.Name 8 select b; (var blog in blogs) 11 { 12 Console.WriteLine(blog.Name); 13 foreach (var post in blog.Posts) 14 { + post.Title); 16 } 17 } 18 }
2、有哪些改变?
A、新特性
a、支持对关系型数据的批量更新。 什么意思就不用细说了吧,在这之前,很多人喷粪EF,就是说他的更新效率太低,如果要实现批量更新,特别插入时,需要借助sql语句或是第三方工具类。相信这是很多人期待的功能;
b、支持唯一约束。它允许你在实体内除主键外额外标识一个键,将他们用作外键。
B、行为(Behavior)改变
在EF6和前期的版本中,顶层API就有很多不直观的行为,虽然EF7尽可能是保持顶层API的相同,但仍去掉了一些限制并添加了一些我们期待的行为。什么意思呢?这听起来有点迷糊,举个例子来说明吧,以前的查询,虽然Linq给我们带来了很大方便,但限制多呀,整个Linq查询翻译成一条单独的sql查询,Linq查询中只能包含EF能翻译成sql的语句或方法;还有就是sql的生成,有时生成了很复杂、效率不高,且不是我们希望的sql语句。EF7改变这种情况,可以返回多结果集,sql评估工作也不是在数据库端来做了,变更到客户端。这样就为生成sql提供了很大的灵活性。如果还有点晕,没关系,先有个印象就行。
C、变得更加简单、灵活
直接使用一个例子来说明吧。我们想通过EF的元数据来获取Blog实体被映射到数据库中的哪一张表。在这之前,我们的代码会是这样:
1 using (var context = new BloggingContext()) 2 { 3 var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; 4 var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace)); entityType = metadata 7 .GetItems<EntityType>(DataSpace.OSpace) 8 .Single(e => objectItemCollection.GetClrType(e) == typeof(Blog)); entitySet = metadata 11 .GetItems<EntityContainer>(DataSpace.CSpace).Single() 12 .EntitySets 13 .Single(s => s.ElementType.Name == entityType.Name); mapping = metadata.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single() 16 .EntitySetMappings 17 .Single(s => s.EntitySet == entitySet); table = mapping 20 .EntityTypeMappings.Single() 21 .Fragments.Single() 22 .StoreEntitySet; tableName = (].Value ?? table.Name; 25 }
在EF7中会代码会是这样:
1 using (var db = new BloggingContext()) 2 { 3 var tableName = db.Model.GetEntityType(typeof(Blog)).Relational().Table; 4 }
D、去掉了一些特性