晚安,我从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"回报。它有什么样的回归模式,为什么它会在每种情况下返回不同的东西?
谢谢大家!
答案 0 :(得分:2)
回答你最广泛的问题;实体框架正在生成SQL,对数据库执行它,并将结果映射到数据对象(称为对象关系映射的过程)。
更具体的问题:
_context
将您的数据库表示为数据对象的集合。你当然拥有关于所有这些对象(它们的属性等)的元数据,但是没有急切地加载数据;所以严格来说,你的对象没有填充。
Include
方法指示EF急切加载这些属性,因此当您获得Instructor
时,您也可以获得他的OfficeAssignment
等,而无需重新查询数据库。如果没有这些,访问导航属性将导致对数据库执行新的查询。
是。实体框架使用LINQ to Entities,它与LINQ to Objects(您习惯使用的内容)非常相似。主要区别在于,因为它最终需要成为SQL,所以在任何lambda表达式中可以执行的操作更具限制性。
我不知道你在说什么:)
注意:要查看生成的查询,请按照以下所述的步骤进行操作:https://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx