EF6中的异步查询和异步保存

在.NET4.5中介绍了异步操作,异步操作在EF中也很有用,在EF6中我们可以使用DbContext的实例进行异步查询和异步保存。

1.异步查询

下边是一个通过L2E语法实现异步查询的栗子:

private static async Task<Student> GetStudent()
{
Student student = null; using (var context = new SchoolDBEntities())
{
Console.WriteLine("Start GetStudent...");
//注意await和FirstOrDefaultAsync
student = await (context.Students.Where(s => s.StudentID == ).FirstOrDefaultAsync<Student>()); Console.WriteLine("Finished GetStudent...");
}
return student;
}

上边的栗子中,GetStudent()方法使用async关键字修饰后就表示它是一个异步方法,异步方法的返回类型必须是Task<T>类型,因为GetStudent()方法要返回一个Student实体,所以返回的类型是Task<Student>。

同样的,Linq表达式使用await关键字修饰,await表示让当前线程去执行其他代码,直到linq表达式执行结束并返回结果。我们使用FirstOrDefaultAsync异步扩展方法来获取结果,我们也可以使用其他的异步扩展方法如SingleOrDefautAsync,ToListAsync等。

2.异步保存

EF API提供了SaveChangesAsync()方法来异步地把数据保存到数据库,下边栗子中的SaveStudent方法异步的将Student实体保存到数据库。

private static async Task SaveStudent(Student editedStudent)
{
using (var context = new SchoolDBEntities())
{
context.Entry(editedStudent).State = EntityState.Modified; Console.WriteLine("Start SaveStudent..."); int x = await (context.SaveChangesAsync()); Console.WriteLine("Finished SaveStudent...");
}
}

3.一个查询,获取结果,保存的栗子

public static void AsyncQueryAndSave()
{
var query = GetStudent(); Console.WriteLine("Do something else here till we get the query result.."); query.Wait(); var student = query.Result; student.FirstName = "Steve";
//上边的SaveStudent方法
var numOfSavedStudent = SaveStudent(student); Console.WriteLine("Do something else here till we save a student.." ); studentSave.Wait(); Console.WriteLine("Saved Entities: {0}", numOfSavedStudent.Result);
}

执行的结果如下所示:

Start GetStudent...
Do something else here till we get the query result..
Finished GetStudent...
Start SaveStudent...
Do something else here till we save a student..
Finished SaveStudent...
Saved Entities:

在上边的栗子中。首先调用GetStudent()方法时,把任务存储在query变量中,执行到await表达式的时候,当前线程被释放,去执行调用方法(AsyncQueryAndSave方法)中的代码,执行到query.wait()时,停止线程执行直到GetStudent()彻底执行完成。一旦GetStudent()执行完成,我们可以通过query.Result获取查询到的Student实例。SaveStudent()也是一样的执行过程。关于异步可以参考以前总结的一篇文章

EF系列目录链接:Entity Franmework系列教程汇总

最新文章

  1. github常用操作
  2. 用python2.7,采集新浪博客
  3. 在iframe中获取本iframe DOM引用
  4. Android UI系列-----Dialog对话框
  5. swift项目中引入OC框架
  6. python实现简单爬虫抓取图片
  7. 《C++ Primer 4th》读书笔记 第7章-函数
  8. Base64 图片转换工具
  9. Silverlight的ComboBox 的绑定和取值
  10. mac版sublime text2包管理器安装步骤
  11. HTML5拖动画布/拖放
  12. HDU 1204 基础DP 非连续字段的最大和
  13. OI队内测试二【数论概率期望】
  14. 前端获取checkbox复选框的值 通过数组形式传递
  15. 走进javascript——重拾数组
  16. HashMap、HashTable
  17. 网页设置下载apk
  18. Timer-triggered memory-to-memory DMA transfer demonstrator
  19. 焦作网络赛K-Transport Ship【dp】
  20. LeetCode 177. Nth Highest Salary

热门文章

  1. eclipse IDE使用git方法简单介绍
  2. #017 python实验课第五周
  3. Python基础之协程
  4. Python开发【内置模块篇】configparser
  5. Hadoop的NullWritable
  6. 乡下人设计模式——SOLID之六大原则
  7. C#自定义应用程序上下文对象+IOC自己实现依赖注入
  8. Vue slot插槽内容分发
  9. idea 配置 jdk tomcat
  10. P1836 【数页码_NOI导刊2011提高(04)】