EF6基础系列(十一)---EF6中的异步查询和异步保存
Posted wyy1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF6基础系列(十一)---EF6中的异步查询和异步保存相关的知识,希望对你有一定的参考价值。
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 == 1).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: 1
在上边的栗子中。首先调用GetStudent()方法时,把任务存储在query变量中,执行到await表达式的时候,当前线程被释放,去执行调用方法(AsyncQueryAndSave方法)中的代码,执行到query.wait()时,停止线程执行直到GetStudent()彻底执行完成。一旦GetStudent()执行完成,我们可以通过query.Result获取查询到的Student实例。SaveStudent()也是一样的执行过程。关于异步可以参考以前总结的一篇文章。
以上是关于EF6基础系列(十一)---EF6中的异步查询和异步保存的主要内容,如果未能解决你的问题,请参考以下文章