预加载和显式加载之间的区别

differences between Eager Loading and Explicit Loading

预加载:

context.Cars.Include(c=>c.Orders)

显式加载:

context.Entry(c).Collection(x => x.Orders).Load();

预加载和显式加载有什么区别?仅仅是语法上的差异,比如 Eager Loading 使用 Include 而 Explicit Loading 使用 Load 吗?但使用 Include 不是也是一种 "explicit" 加载导航属性的方式吗,那么为什么预加载不被认为与显式加载相同?

Eager loading 与 Lazy loading 相反,但 Explicit loading 类似于 lazy loading,不同之处在于:您在代码中显式检索相关数据;当您访问导航 属性 时,它不会自动发生。

您可以通过获取实体的对象状态管理器条目并为集合调用 Collection.Load 方法或为包含单个实体的属性调用 Reference.Load 方法来手动加载相关数据。

EntityFramework returns IQueryable对象,本质上包含对数据库的查询。但是这些直到第一次被枚举时才会执行。

Load() 执行查询,以便将其结果存储在本地。 调用 Load() 与调用 ToList() 并丢弃该 List 相同,没有创建 List 的开销。

预加载加载相关实体作为查询的一部分,即在实际执行查询时加载实体。这与通过导航 属性.

访问相关实体时加载相关实体的延迟加载相反

调用 Load() 显式加载您请求的实体,而不是等待您访问导航属性。例如,当初始查询没有 return 任何相关实体(因为您没有使用预先加载)并且出于任何原因禁用了延迟加载时,它很有用。