EF 6中的异步查询和保存方法
在. net 4.5中引入了异步执行,这在实体框架中很有用。EF 6允许我们使用DbContext实例异步执行查询和命令。
让我们先看看如何执行异步查询,然后,我们将看到一个对context.SaveChanges的异步调用。
异步查询
下面是异步方法的示例,它异步执行LINQ-to-Entity的查询并返回结果。
private static async Task<Student> GetStudent()
{
Student student = null;
using (var context = new SchoolDBEntities())
{
Console.WriteLine("Start GetStudent...");
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关键字标记。这将释放调用线程以执行其他代码,直到执行查询并返回结果为止(不会阻塞当前主线程)。我们使用了FirstOrDefaultAsync异步扩展方法来获得结果。你可以适当地使用其他异步方法,如SingleOrDefaultAsync, ToListAsyn等。
异步保存
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...");
}
}
获取异步查询结果
下面的示例演示执行一个异步查询,获取结果并保存修改后的实体。
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";
var studentSave= SaveStudent(student);
Console.WriteLine("Do something else here till we save a student.." );
studentSave.Wait();
Console.WriteLine("Saved Entities: {0}", studentSave.Result);
}
Output
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(),它将引用存储在查询变量中。这将开始执行GetStudent()方法,但释放调用线程,以便它可以在AsyncQueryAndSave方法中执行进一步的语句。query.wait()方法将保持执行直到异步方法完成。一旦它完成,我们就可以使用变量query.Result获得结果。以同样的方式调用异步保存方法并获取结果。
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/