Entity Framework入门教程(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("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()也是一样的执行过程。关于异步可以参考以前总结的一篇文章

 

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

posted @   捞月亮的猴子  阅读(6100)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示