zoukankan      html  css  js  c++  java
  • 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系列教程汇总

  • 相关阅读:
    java加载类的方法1.classloader 2.class.forName()
    servlet与线程与jdbc connection的关系
    static再次深入理解
    多线程读某个共享变量有时候也要给读方法加锁
    多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?
    接口耗时打印并统计
    Java从设计模式[本场比赛状态转换武器]状态分析(State)模式
    Openstack中间DVR Part1 -- 东西走向的交通处理
    写酷“大神”的公开信
    从反思谈论阵列和指针的几个问题,腾讯的笔名
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9636419.html
Copyright © 2011-2022 走看看