EF 6 DB-First系列--EF 6中的异步查询和保存方法

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值