Entity Framework入門教程(11)---EF6中的異步查詢和異步保存

EF6中的異步查詢和異步保存

在.NET4.5中介紹了異步操做,異步操做在EF中也頗有用,在EF6中咱們能夠使用DbContext的實例進行異步查詢和異步保存。html

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等。async

2.異步保存

EF API提供了SaveChangesAsync()方法來異步地把數據保存到數據庫,下邊栗子中的SaveStudent方法異步的將Student實體保存到數據庫。post

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);
}

執行的結果以下所示:spa

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系列教程彙總code

相關文章
相關標籤/搜索