EntityFramework⼊门教程(11)---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("");
//注意await和FirstOrDefaultAsync
student = await (context.Students.Where(s => s.StudentID == 1).FirstOrDefaultAsync<Student>());
Console.WriteLine("");
}
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("");
int x = await (context.SaveChangesAsync());
Console.WriteLine("");
}
}
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);
}
writeline教程执⾏的结果如下所⽰:
Do something else here till we get the query result..
Do something else here till we save a student..
Saved Entities: 1
在上边的栗⼦中。⾸先调⽤GetStudent()⽅法时,把任务存储在query变量中,执⾏到await表达式的时候,当前线程被释放,去执⾏调⽤⽅法(AsyncQueryAndSave⽅法)中的代码,执⾏到query.wait()时,停⽌线程执⾏直到GetStudent()彻底执⾏完成。⼀旦GetStudent()执⾏完成,我们可以通过query.Result获取查询到的Student实例。SaveStudent()也是⼀样的执⾏过程。关于异步可以参考。
EF系列⽬录链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论