开发手册 欢迎您!
软件开发者资料库

Entity Framework - 异步查询

Entity Framework异步查询 - 从概述,体系结构,环境设置,数据库设置,数据模型,DbContext,类型,关系,生命周期,代码优先方法,模型优先方法,数据库第一方法,DEV方法,数据库操作,并发开始学习实体框架,事务,视图,索引,存储过程,断开连接的实体,表值函数,本机SQL,枚举支持,异步查询,持久性,投影查询,命令记录,命令拦截,空间数据类型,继承,迁移,渴望,懒惰,显式加载,验证,跟踪更改,彩色实体,第一个示例,数据注释,Fluent API,种子数据库,代码优先迁移,多个DbContext,嵌套实体类型。

异步编程涉及在后台执行操作,以便主线程可以继续自己的操作.这样主线程可以在后台线程处理手头的任务时保持用户界面的响应.

  • 实体框架6.0支持异步操作以查询和保存数据.

  • 异步操作可以通过以下方式帮助您的应用程序 :

    • 让您的应用程序更好地响应用户交互

    • 提高应用程序的整体性能

  • 您可以通过各种方式执行异步操作.但是在.NET Framework 4.5中引入了异步/等待关键字,这使得您的工作变得简单.

  • 您唯一需要遵循的是异步/等待模式由以下代码片段说明.

让我们看一下DatabaseOperations方法保存的以下示例(不使用async/await)一个新学生到数据库,然后从数据库中检索所有学生,最后在控制台上打印一些额外的消息.

 class Program {   static void Main(string[] args) {      Console.WriteLine("Database Operations Started");      DatabaseOperations();      Console.WriteLine();      Console.WriteLine("Database Operations Completed");      Console.WriteLine();      Console.WriteLine("Entity Framework Tutorials");      Console.ReadKey();   }   public static void DatabaseOperations() {      using (var context = new UniContextEntities()) {         // Create a new student and save it         context.Students.Add(new Student {            FirstMidName = "Akram",             LastName = "Khan",             EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())});         Console.WriteLine("Calling SaveChanges.");         context.SaveChanges();         Console.WriteLine("SaveChanges completed.");         // Query for all Students ordered by first name         var students = (from s in context.Students            orderby s.FirstMidName select s).ToList();         // Write all students out to Console         Console.WriteLine();         Console.WriteLine("All Student:");         foreach (var student in students) {            string name = student.FirstMidName + " " + student.LastName;            Console.WriteLine(" " + name);         }      }   }}

执行上述代码后,您将收到以下内容输出 :

Calling SaveChanges.SaveChanges completed.All Student:Akram KhanAli KhanAli AlexanderArturo AnandBill GatesGytis BarzdukasLaura  NornanMeredith fllonsoNino OlioettoPeggy JusticeYan LiEntity Framework Tutorials

让我们使用新的async和await关键字并对Program.cs进行以下更改

  • 添加System.Data.实体命名空间,它将提供EF异步扩展方法.

  • 添加System.Threading.Tasks命名空间,这将允许我们使用任务类型.

  • 更新 DatabaseOperations 以标记为 async 并返回任务.

  • 调用SaveChanges的异步版本并等待其完成.

  • 调用ToList的Async版本和等待结果.

class Program {   static void Main(string[] args) {      var task = DatabaseOperations();      Console.WriteLine();      Console.WriteLine("Entity Framework Tutorials");      task.Wait();      Console.ReadKey();   }   public static async Task DatabaseOperations() {      using (var context = new UniContextEntities()) {         // Create a new blog and save it         context.Students.Add(new Student {            FirstMidName = "Salman",             LastName = "Khan",             EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())});         Console.WriteLine("Calling SaveChanges.");         await context.SaveChangesAsync();         Console.WriteLine("SaveChanges completed.");         // Query for all Students ordered by first name         var students = await (from s in context.Students             orderby s.FirstMidName select s).ToListAsync();         // Write all students out to Console         Console.WriteLine();         Console.WriteLine("All Student:");         foreach (var student in students) {            string name = student.FirstMidName + " " + student.LastName;             Console.WriteLine(" " + name);         }      }   }}

执行时,它将产生以下输出.

Calling SaveChanges.Entity Framework TutorialsSaveChanges completed.All Student:Akram KhanAli KhanAli AlexanderArturo AnandBill GatesGytis BarzdukasLaura  NornanMeredith fllonsoNino OlioettoPeggy JusticeSalman KhanYan Li

现在,代码是异步的,您可以观察程序的不同执行流程.

  • SaveChanges开始将新学生推送到数据库然后DatabaseOperations方法返回(即使它还没有完成执行),Main方法中的程序流继续.

  • 然后将消息写入console.

  • 在Wait调用中阻止托管线程,直到数据库操作完成.一旦完成,我们将继续执行DatabaseOperations的剩余部分.

  • SaveChanges完成.

  • 从数据库中检索所有学生并写入控制台.

我们建议您在一个步骤中执行上述示例为了更好地理解,逐步的方式.