关于Entity Framework,在运行时会发生什么

时间:2017-06-01 22:46:33

标签: c# asp.net-mvc entity-framework linq entity-framework-core

晚安,我从AspNet Core 1.1开始,我也使用Entity FrameWork Core 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实例" _context"我手头有什么?我已经在上下文中填充了已填充的所有对象,因为这是我添加"包含"时的样子。和"然后包括"或者在那一刻我只是#34;安装查询"如果是,我怎么能看到这个查询被挂载?

第二个问题:实体框架是否使用LINQ?我知道这是另一回事,但有时感觉它是相同的东西!你在两者中找到Wheres and Orders By,我不知道何时使用其中一个,如果你能向我解释我会非常感激。

第三个问题:总是让我感到困惑的是,与实体的查询返回我,它真的非常奇怪,以至于在示例中我看到人们也没有" typam"回报。它有什么样的回归模式,为什么它会在每种情况下返回不同的东西?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

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

更具体的问题:

  1. _context将您的数据库表示为数据对象的集合。你当然拥有关于所有这些对象(它们的属性等)的元数据,但是没有急切地加载数据;所以严格来说,你的对象没有填充。

    Include方法指示EF急切加载这些属性,因此当您获得Instructor时,您也可以获得他的OfficeAssignment等,而无需重新查询数据库。如果没有这些,访问导航属性将导致对数据库执行新的查询。

  2. 是。实体框架使用LINQ to Entities,它与LINQ to Objects(您习惯使用的内容)非常相似。主要区别在于,因为它最终需要成为SQL,所以在任何lambda表达式中可以执行的操作更具限制性。

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

  4. 注意:要查看生成的查询,请按照以下所述的步骤进行操作:https://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx