Entity Framework异步查询和保存
EF6开始提供了通过async和await关键字实现异步查询和保存的支持(.net 4.5及更高版本)。虽然不是所有的操作都能从异步中获益,但是耗时的操作、网络或IO密集型任务中,使用异步可以提升客户端性能和增强服务器的扩展性。
本文将覆盖一下主题:
- 实例演练异步操作
- 创建模型
- 创建同步程序
- 改为异步操作
实例演练异步操作
下面演练将通过对比,很容易的观察异步操作和同步操作,该演练目的不是说明何时才是异步操作的关键场景。
创建模型
下面使用CodeFirst的流程创建模型并生成数据库,不过异步方法可以很好的工作于所有EF模型,包括EF设计器生成的模型。
创建一个控制台应用程序AsyncDemo。
添加EntityFramework NuGet包到项目中。
添加Model.cs到项目中,代码如下:
1 using System.Collections.Generic; 2 using System.Data.Entity; 3 4 namespace AsyncDemo 5 { 6 public class BloggingContext : DbContext 7 { 8 public DbSet<Blog> Blogs { get; set; } 9 public DbSet<Post> Posts { get; set; } 10 } 11 12 public class Blog 13 { 14 public int BlogId { get; set; } 15 public string Name { get; set; } 16 17 public virtual List<Post> Posts { get; set; } 18 } 19 20 public class Post 21 { 22 public int PostId { get; set; } 23 public string Title { get; set; } 24 public string Content { get; set; } 25 26 public int BlogId { get; set; } 27 public virtual Blog Blog { get; set; } 28 } 29 }
创建同步程序
有了EF模型,下面通过代码模拟数据库存取。
1 using System; 2 using System.Linq; 3 4 namespace AsyncDemo 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 PerformDatabaseOperations(); 11 12 Console.WriteLine(); 13 Console.WriteLine("Quote of the day"); 14 Console.WriteLine(" Don't worry about the world coming to an end today... "); 15 Console.WriteLine(" It's already tomorrow in Australia."); 16 17 Console.WriteLine(); 18 Console.WriteLine("Press any key to exit..."); 19 Console.ReadKey(); 20 } 21 22 public static void PerformDatabaseOperations() 23 { 24 using (var db = new BloggingContext()) 25 { 26 // Create a new blog and save it 27 db.Blogs.Add(new Blog 28 { 29 Name = "Test Blog #" + (db.Blogs.Count() + 1) 30 }); 31 db.SaveChanges(); 32 33 // Query for all blogs ordered by name 34 var blogs = (from b in db.Blogs 35 orderby b.Name 36 select b).ToList(); 37 38 // Write all blogs out to Console 39 Console.WriteLine(); 40 Console.WriteLine("All blogs:"); 41 foreach (var blog in blogs) 42 { 43 Console.WriteLine(" " + blog.Name); 44 } 45 } 46 } 47 } 48 }
上面代码通过调用PerformDatabaseOperations() 保存一个Blog对象到数据库中,然后从数据库中检索所有Blog,并显示到控制台,然后显示一行文本”Quote of the day“。
由于上面程序是同步执行的,所有可以观察到程序按下面流程执行:
- SaveChanges保存Blog对象到数据库中。
- SaveChanges完成。
- 发送查询Blog请求到数据库。
- 查询返回结果,并写入控制台。
- 显示文本“Quote of the day”到控制台。
改造为异步操作
对上面程序加以修改,使用async和await关键字实现异步操作。
1 using System; 2 using System.Data.Entity; 3 using System.Linq; 4 using System.Threading.Tasks; 5 6 namespace AsyncDemo 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 var task = PerformDatabaseOperations(); 13 14 Console.WriteLine("Quote of the day"); 15 Console.WriteLine(" Don't worry about the world coming to an end today... "); 16 Console.WriteLine(" It's already tomorrow in Australia."); 17 18 task.Wait(); 19 20 Console.WriteLine(); 21 Console.WriteLine("Press any key to exit..."); 22 Console.ReadKey(); 23 } 24 25 public static async Task PerformDatabaseOperations() 26 { 27 using (var db = new BloggingContext()) 28 { 29 // Create a new blog and save it 30 db.Blogs.Add(new Blog 31 { 32 Name = "Test Blog #" + (db.Blogs.Count() + 1) 33 }); 34 Console.WriteLine("Calling SaveChanges."); 35 await db.SaveChangesAsync(); 36 Console.WriteLine("SaveChanges completed."); 37 38 // Query for all blogs ordered by name 39 Console.WriteLine("Executing query."); 40 var blogs = await (from b in db.Blogs 41 orderby b.Name 42 select b).ToListAsync(); 43 44 // Write all blogs out to Console 45 Console.WriteLine("Query completed with following results:"); 46 foreach (var blog in blogs) 47 { 48 Console.WriteLine(" - " + blog.Name); 49 } 50 } 51 } 52 } 53 }
现在程序变为异步执行,可以观察到异步执行顺序为:
- 发送SaveChanges请求到数据库。
- 该请求发送给数据库时,当前线程不在占用CPU时间,从方法PerformDatabaseOperations中返回(虽然该方法还没有执行完成),控制权返回给主线程执行。
- 显示字符串“Quote of the day ”到控制台。
- SaveChanges完成。
- 发起查询Blogs请求到数据库。
- 查询完成返回结果,并显示到控制台。
转载于:https://www.cnblogs.com/from1991/p/5425263.html
Entity Framework异步查询和保存相关推荐
- 整理一下Entity Framework的查询
Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...
- (转)动态Entity Framework查询:Dynamic Query 介绍
原文地址:http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic ...
- Entity Framework 简单增删改操作
前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...
- Entity Framework 5.0基础系列
1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...
- 【查询】—Entity Framework实例详解
Entity Framework 查询使用集成查询,简称LINQ.LINQ是一个查询框架,并不限于Entity Framework使用,同样不限于数据库.LINQ Provider 负责将LINQ查询 ...
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...
- Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能)
Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能) 昨天我们讲了 DBContext的作用及它的一些相对于ObjectContext进行的优化,今天继续进 ...
最新文章
- C#写的NoSQL开源项目/系统(系列)
- java filestream 包,java.io.FileOutputStream.write(byte[] b)
- 队列表mysql,什么是在mysql中实现消息队列表的最佳方法
- EducationalCodeforcesRound62(Div. 2)(A-D题解)
- drools6.5_Drools 6.4.0.Final提供
- [html] 如何实现多行文字梯形排版?
- BFC 神奇背后的原理
- pytorch 如何使用cuda
- jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
- ubuntu下从软件中心安装软件时的软件缓存目录
- DSA数字签名原理及python实现
- Linux中scp报 not a regular file错误解决方案
- 还搞不懂JVM?这一篇教你JVM从入门到入魔,全篇干货满满!
- 2008年9月3号,星期三,晴。日日行,不怕千万里;常常做,不怕千万事。 ——《格言联璧•处事》
- 前端面试题总结(js、html、小程序、React、ES6、Vue、全栈)
- 数据分析实战一:教育课程案例线上平台数据分析
- 既想吸猫又不想当猫奴?这款治愈系的机器人或许会适合你
- python之API接口调用
- Position 的四种属性值
- 基于Vue2.x的前端架构,我们是这么做的
热门文章
- C#--数据类型和类型转换
- 常用抓包工具(可编程抓包工具)
- windows中search driver的顺序
- 40张图彻底揭秘:输入网址究竟发生了什么?
- 太逗了,面试官让我讲线程 WAITING 状态!
- 如果我是一线技术主管……
- 在阿里干了五年,面试个小公司挂了…
- 6.OSI七层网络模型与TCP/IP四层网络模型
- 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
- linux重定向进程输出到文件删除,Linux文件编辑器vim输出输入重定向、管道以及进程(示例代码)...