前言

目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明。

注意:如果你要在Visual Studio 中使用 .NET Core 2.0 , 你需要至少 Visual Studio 2017 15.3 预览版本。

安装或升级到 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; }
}

在生成数据库表的时候,CustomerAddress 将生成为一个表。

注意: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 中添加此功能。


原文地址:https://blogs.msdn.microsoft.com/dotnet/2017/05/12/announcing-ef-core-2-0-preview-1

翻译:杨晓东(Savorboard)

本文地址:http://www.cnblogs.com/savorboard/p/announcing-ef-core-2-0.html

欢迎转载,请在明显位置给出出处及链接

EF Core 2.0 新特性的更多相关文章

  1. Entity Framework Core 2.0 新特性

    本文翻译来自:https://docs.microsoft.com/en-us/ef/core/what-is-new/index 一.模型级查询过滤器(Model-level query filte ...

  2. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  3. EF Core 6.0的新计划

    今天,我们很兴奋地与你分享Entity Framework Core 6.0的计划. 这个计划汇集了许多人的意见,并概述了我们打算在哪里以及如何优化实体框架(EF Core) 6.0版本.这个计划并不 ...

  4. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  5. EF Core 1.0中使用Include的小技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于EF Core暂时不支持Lazy Loading,所以利用Include来加载额外 ...

  6. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  7. EF Core 2.0 执行原始查询如何防止SQL注入

    using (var context = new EFCoreDbContext()) { var searchString = "Jeffcky Wang"; Formattab ...

  8. C# 7.0 新特性4: 返回引用

    本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...

  9. .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介

    .NET Core 1.0.ASP.NET Core 1.0和EF Core 1.0简介 英文原文:Reintroducing .NET Core 1.0, ASP.NET Core 1.0, and ...

随机推荐

  1. ES6常用语法整合

    ES6也出来有一会时间了,他新增的语法糖也的确大大提高了开发者的效率,今天就总结一些自己用到最多的. 说到ES6肯定是先介绍Babel了,据阮一峰老师介绍到,Babel是一个广泛使用的转码器,可以将E ...

  2. 提高 webpack 构建 Vue 项目的速度

    前言 最近有人给我的 Vue2 后台管理系统解决方案 提了 issue ,说执行 npm run build 构建项目的时候极其慢,然后就引起我的注意了.在项目中,引入了比较多的第三方库,导致项目大, ...

  3. React Native 导入原生Xcode项目总结与记录

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. C#, VB.NET如何加密PDF文档

    在日常工作中,人们通常通过加密PDF文档的方式来保护PDF文档.不管是公司还是个人,使用PDF加密术来设置一些权限是必不可少的.为了使PDF文档既可读又不能被未授权的用户所更改,一份PDF文档往往需要 ...

  5. Ubuntu 12.4 server 安装 redmine

    1,安装默认的redmine apt-get install apache2 libapache2-mod-passenger mysql-server redmine redmine-mysql 直 ...

  6. KMP算法【代码】

    废话不多说,看毛片算法的核心在于next数组. 很多地方用的都是严书上的方法来求解next数组,代码确实简洁明了,但是可能对于初学者来说不容易想到,甚至不是一下子能理解.(好了,其实我说的就是自己,别 ...

  7. 跟着刚哥梳理java知识点——数组(七)

    数组:数组是多个相同类型数据类型的集合,实现对这些数据的统一管理. 元素:数组中的元素可以是任何数据类型,包括基本数据类型和引用类型. 特点:属于引用类型,数组型数据是对象object,数组中的每个元 ...

  8. ios 网络/本地播放器

    推荐播放器: LRLAVPlayer相对易懂好修改,调整添加内容. https://github.com/codeWorm2015/videoPlayer NSString*path=[[NSBund ...

  9. shell初步了解

    shell的类型 查看用户所用的shell程序,在/etc/passwd 文件中的第七个字段(好像就是最后一个,主要是bash shell) 还有一个默认shell是/bin/sh,它作为默认的系统s ...

  10. ajax发送异步请求

    一:得到XMLHttpRequest对象 ajax其实只需要学习XMLHttpRequest一个对象 大多数浏览器都支持: var xmlHttp = new XMLHttprequest(); IE ...