2017-06-01 52 views
0

晚安发生什么事,我开始在ASPNET核心1.1,我也用实体架构核心1.0。关于实体框架,在运行时

我做了一些课程,我已经理解如何带来数据,保存等。我想了解通过“布下”会发生什么,因为我见过的所有教程都解释了如何使用它,但我不了解它的简单“一步一步”。

我的第一个问题很简单,什么是在某种情况发生时,我们预约,我们在手的BD的“语境”。例如:

var viewModel = new InstructorIndexData(); 
    viewModel.Instructors = await _context.Instructors 
      .Include(i => i.OfficeAssignment) 
      .Include(i => i.CourseAssignments) 
      .ThenInclude(i => i.Course) 
       .ThenInclude(i => i.Enrollments) 
        .ThenInclude(i => i.Student) 
      .Include(i => i.CourseAssignments) 
      .ThenInclude(i => i.Course) 
       .ThenInclude(i => i.Department) 
      .AsNoTracking() 
      .OrderBy(i => i.LastName) 
      .ToListAsync(); 

注意:示例本身并不重要,我想了解到底发生了什么。

首先怀疑,当我有上下文实例“_context”什么我手头上?我已经在上下文中填充了所有已填充的对象,因为当我添加“Includes”和“ThenIncludes”时,或者在那一刻,我只是“挂载查询”,看起来像是什么样子?如果是,我怎么能看到这个查询是安装?

第二个问题:是否实体框架使用LINQ?我知道这是另一回事,但有时候感觉就像是同一件事!你在这两个地方找到Wheres和Orders By,我不知道什么时候使用这个或那个,如果你能向我解释,我会非常感激。

第三个问题:它总是让我困惑的是与实体查询返回了我,这真的很奇怪,以至于在我的例子见人也不是“typam”的回归。它有什么样的模式回报,为什么它会在每种情况下返回不同的东西?

谢谢大家!

回答

2

要回答你的问题最广;实体框架正在生成SQL,根据数据库执行它,并将结果映射到数据对象(称为对象关系映射的过程)。

要在更具体的问题:

  1. _context代表你的数据库作为数据对象的集合。你肯定有关于所有这些对象的元数据(它们的属性等),但没有数据被急切地加载;所以严格来说,你的对象没有被填充。

    Include方法指示EF急于加载这些属性,所以当你得到Instructor时,你也可以得到他的OfficeAssignment等,而不必重新查询数据库。如果没有这些,访问导航属性将导致对数据库执行新的查询。

  2. 是的。实体框架使用LINQ to Entities,这与LINQ to Objects非常相似(你习惯使用什么)。主要区别在于,因为它最终需要成为SQL,所以对于任何lambda表达式内部可以执行哪些操作都会受到更多的限制。

  3. 我不知道你在说什么:)

注意:要查看生成的查询,请在描述的步骤:https://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

+0

只是为了一个小小的注脚添加到这个答案,你可以看到你的翻译的查询是这样的:https://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx –

+0

@TravisActon谢谢;包括在内。 – BradleyDotNET

+0

感谢aloot @BradleyDotNET。所以才完成。当我添加“Include”和“ThenInclude”时,EF不做任何事情?没有什么像每个新的“包含”一样的新搜索。这就像构建查询每个“include”和“thenInclude”追加,然后在最后一次执行Querys使用查询这些连接,是吗?例如,最后在“ToListAsync”执行一次? –