实体框架中的Lazy和Eager Loading在两者中使用.Include()时给出了相同的结果



我曾尝试在EF中实现懒惰和渴望加载。一切似乎都很好,但.Include()方法在这两种情况下都可用,并且无论延迟加载false还是true都会返回相同的结果。

我有两个桌子类别和产品。类别可以有多个使用外键的产品和相关产品。

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

同样的行为表现在急切的加载上。

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

以上两行的结果相同。请澄清这种混淆。

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

请发表您的宝贵意见。提前谢谢。

当您显式使用Include()时,您正在预形成Eager加载。显然,禁用/启用Lazy加载没有任何效果。

当您在某些Category实例中省略Include并尝试访问Products导航属性时,差异将得到反映。如果启用了Lazy Loading,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应用程序中存在延迟加载的情况,您最好明确您想要从DB中获得的数据。

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

最新更新