Entity Framework 中的延迟加载和急切加载在两者中使用 .Include() 时给出相同的结果?

Lazy and Eager Loading in Entity Framework gives same result while using .Include() in both?

我尝试在 EF 中实现延迟加载和急切加载。一切似乎都很好,但是 .Include() 方法在两种情况下都可用,并且 returns 无论延迟加载 false 还是 true,结果都是一样的。

我有 2 个表类别和产品。类别可以有多个产品并使用外键关联。

当我使用 .Include("Products") 使用延迟加载加载类别时,它会加载与类别相关的所有产品。

预加载显示了相同的行为。

var results = objDB.Categories.Include("Products").ToList(); // Enabled lazy load

var results = objDB.Categories.Include("Products").ToList(); // Disabled lazy load

以上两行结果相同。请澄清这个困惑。

.Include 在延迟加载 = true 的情况下不应该可用。

请您提出宝贵意见。提前致谢。

当您明确使用 Include() 时,您正在执行 Eager 加载。很明显,disabling/enablingLazy加载没有效果。

当您省略 Include 并尝试在某些 Category 实例中访问 Products 导航-属性 时,差异就会体现出来。启用延迟加载后,EF 将从数据库加载它。当它被禁用时,你会得到 null.

不同之处在于,如果您对原始查询 加载的任何实体进行延迟加载,这些实体将可以透明地访问,并且在访问时将触发额外的查询。例如

var results = objDB.Categories.Include("Products").ToList(); // Enabled lazy load
var thing = results.First().Products.First().AnotherEntity;//This will trigger another query and thing will get a value

var results = objDB.Categories.Include("Products").ToList(); // Disabled lazy load
var thing = results.First().Products.First().AnotherEntity;//Thing will be null as its not included in the original result set

FWIW 我认为大多数使用延迟加载的人都会给自己带来问题。我唯一会使用延迟加载的地方是在 forms/wpf 应用程序中,人们实际上是在浏览数据库中的数据,而您希望在用户单击时获取更多数据。我不认为在 Web 应用程序中有延迟加载的情况,你最好明确说明你想要从数据库中获取的数据。

Include 和 ToList 都被视为急切方法,因此您不会调用延迟加载。只有当您尝试访问相关实体的属性时,延迟加载功能才会启动。