EF Core 2.0 新特性
前言
目前 EF Core 的最新版本为 2.0.0-priview1-final
,所以本篇文章主要是针对此版本的一些说明。
注意:如果你要在Visual Studio 中使用 .NET Core 2.0 , 你需要至少 Visual Studio 2017 15.3 预览版本。
相关mysql视频教程推荐:《mysql教程》
安装或升级到 EF Core 2.0
你可以通过以下命令来安装或者升级你目前的 .NET Core 版本。
// 安装 PM> install-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final // 升级 PM> update-package Microsoft.EntityFrameworkCore.SqlServer -Pre -Version 2.0.0-preview1-final
工具包
// 直接修改 CSPROJ 文件 <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview1-final" /> </ItemGroup> // 或者通过以下命令 PM> update-package Microsoft.EntityFrameworkCore.Tools -Pre -Version 2.0.0-preview1-final
EF Core 2.0 新功能
改进的 LINQ 翻译
避免创建不必要的子查询
一些命令将切换到客户端进行执行
只有少数请求才会检索表的所有列
有事没有适当的过滤条件,将单个LINQ 查询转换为 N + 1 查询。
EF.Functions.Like()
在 EF Core 2.0 中添加了 EF.Functions 属性,EF Core Provider 可以使用它们来自定义一些映射到数据库函数后者运算符的方法,以便于在 LINQ 查询中调用它们。如:
var aCustomers = from c in context.Customers where EF.Functions.Like(c.Name, "a%"); select c;
分离实体和表
分离实体和表什么意思呢?在以前,一个数据库表会映射到 EF 中的一个实体对象,也就是表和实体是一一对应的关系。那么在 2.0 版本中,允许映射一些关联的实体到一个表中,并且EF会维护这些实例或者引用关系。
modelBuilder.Entity<Customer>() .OwnsOne(c => c.WorkAddress);public class Customer { public int CustomerId { get; set; } public Address WorkAddress { get; set; } }public class Address { public string Line { get; set; } public string PostalOrZipCode { get; set; } public string StateOrProvince { get; set; } public string CityOrTown { get; internal set; } }
在生成数据库表的时候,Customer
和 Address
将生成为一个表。
注意:priview1 中此功能暂不完整。
全局查询过滤
新版本引入了一个叫做“垂直过滤”的一个功能,这是一个比较常见的需求。
在我们定义EF Core上下文模型的时候,可以在模型创建的时候附加一些过滤条件,比如在查询的时候总是过滤掉一些“逻辑删除”的数据。
public class BloggingContext : DbContext { public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } public int TenantId {get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Post>() .HasQueryFilter(p => !p.IsDeleted && p.TenantId == this.TenantId ); } }
当通过直接查询或者导航属性(Include()
)查询类型数据时,将会自动应用此过滤条件。当然你可以使用 IgnoreQueryFilters()
来在查询中禁用此全局过滤器。
DbContext 连接池
通常在 ASP.NET Core 中使用 EF Core 会涉及到自定义的 DbContext,然后注入到系统容器中,再通过 Controller 的构造函数从容器中来获取该对象实例。这也就意味着在每个请求中都会创建一个新的实例。
在EF Core 2.0 中,引入了一种新的注入自定义DbContext的方式,它显示的使用了一种实例池的方式来注入到容器。
services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString));
使用此方式的话,当 Controller 请求 DbContext 实例的时候,将会首先检查池中是否有可用的实例,一旦请求处理完成,附加到改实例上的任何状态都将会重置,然后实例会重新返回到池中。
这个概念有点类似 ADO.NET 中的数据库连接池,它具有节省初始化 DbContext 实例成本的优点。很多ASP.NET Core 应用程序可以采用此方式来获得性能上的提升。
手动编译查询
在以前版本的 EF 和 Linq to SQL 中提供有可以手动或者显示的编译查询的API,它允许应用程序缓存已经翻译的查询,这样他们就可以只编译一次,并且执行多次。
虽然 EF Core 可以根据查询表达式自动编译和缓存查询,但是这种机制可以通过绕过哈希计算或者高速缓存来获取小幅的查询性能提升,从而允许应用程序使用已经调用委托链编译通过的查询。
private static Func<CustomerContext, int, Customer> _customerById = EF.CompileQuery((CustomerContext db, int id) => db.Customers .Include(c => c.Address) .Single(c => c.Id == id)); ...using (var db = new CustomerContext()) { var customer = _customerById(db, 147); }
其他
EF Core 2.0 还将对一些日志记录以及诊断的基础架构进行一些比较大的调整,以及和 Azure Application Insights 的整合工作。
对于 Lazy Loading (延迟加载)功能的增加,目前还在讨论当中,也许会在 EF Core 2.1 中添加此功能。
以上是EF Core 2.0 新特性的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP8.3发布:新特性一览随着技术的不断发展和需求的不断变化,编程语言也在不断更新和改进。作为一种广泛应用于网络开发的脚本语言,PHP一直在不断进步,为开发者提供更强大和高效的工具。最近发布的PHP8.3版本带来了许多期待已久的新特性和改进,下面让我们来看一下这些新特性的一览。非空属性的初始化在过去的PHP版本中,如果一个类的属性没有被明确赋值,它的值

深入解析PHP8的新特性,助您掌握最新技术随着时间的推移,PHP编程语言一直在不断演进和改进。最近发布的PHP8版本为开发者提供了许多令人兴奋的新特性和改进,为我们的开发工作带来了更多便利和效率。在本文中,我们将深入解析PHP8的新特性,并提供具体的代码示例,旨在帮助您更好地掌握这些最新的技术。JIT编译器PHP8引入了JIT(Just-In-Time)编

php8新特性有JIT 编译器、类型推导、命名参数、联合类型、属性、错误处理改进、异步编程支持、新的标准库函数和匿名类的扩展等。详细介绍:1、JIT编译器,PHP8引入了JIT编译器,这是一个重要的性能改进,JIT编译器可以对一些高频执行的代码进行实时编译和优化,从而提高运行速度;2、类型推导,PHP8引入了类型推导功能,允许开发者在声明变量时自动推导出变量的类型等等。

【Go语言新特性解读:让编程更高效,需要具体代码示例】近年来,Go语言在软件开发领域备受关注,其简洁、高效的设计理念吸引了越来越多的开发者。作为一种静态类型的编程语言,Go语言不断推出新的特性以提高开发效率,简化代码编写过程。本文将深入解读Go语言最新的特性,探讨如何通过具体的代码示例来体验这些新特性带来的便利。模块化开发(GoModules)Go语言从1

CSS3的新特性一览:如何使用CSS3实现过渡效果CSS3作为CSS的最新版本,在众多新特性中,最有趣和实用的应该是过渡效果(transition)。过渡效果可以让我们的页面在交互时更加平滑、漂亮,给用户带来良好的视觉体验。本文将介绍CSS3过渡效果的基本用法,并附带相应的代码示例。transition-property属性:指定需要过渡的CSS属性过渡效果

PHP8.1引入的新的Redis扩展随着互联网的快速发展,大量的数据需要进行存储和处理。为了提高数据处理的效率和性能,缓存成为了一个不可或缺的部分。而在PHP开发中,Redis作为一种高性能的键值对存储系统,被广泛应用于缓存和数据存储的场景。为了进一步提升Redis在PHP中的使用体验,PHP8.1引入了新的Redis扩展,本文将介绍这一扩展的新增功能,并给

go语言的新特性有:1、Go模块,用于管理Go语言项目的依赖关系;2、错误处理,增加了一个新的错误类型error,使得错误处理更加灵活和简洁;3、上下文包,用于在goroutine之间传递请求范围的值;4、嵌入,即一个结构体可以嵌入到另一个结构体中;5、同步包,更好地控制goroutine之间的同步和通信;6、错误值,更好地区分不同类型的错误;7、泛型,让开发者编写更灵活。

CSS3的新特性一览:如何使用CSS3实现水平居中布局在网页设计和布局中,水平居中布局是一项常见的需求。过去,我们经常使用复杂的JavaScript或CSS技巧实现此目的。然而,CSS3引入了一些新的特性,使得水平居中布局更加简单和灵活。本文将介绍一些CSS3的新特性,并提供一些代码示例,演示如何使用CSS3实现水平居中布局。一、使用flexbox布局fle
