有没有办法配置 DbContext 以急切地加载其所有实体?我们尝试过:
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
我们尝试了关闭和不关闭 ProxyCreationEnabled。
我只是碰巧知道我们正在加载的数据库不是很大,不会经常更改,并且被大量引用。因此,将其全部保存在内存中将是非常有利的。
有没有办法配置 DbContext 以急切地加载其所有实体?我们尝试过:
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
我们尝试了关闭和不关闭 ProxyCreationEnabled。
我只是碰巧知道我们正在加载的数据库不是很大,不会经常更改,并且被大量引用。因此,将其全部保存在内存中将是非常有利的。
不,LazyLoadingEnabled
禁用并不意味着“EagerLoadingEnabled”。它是:“甚至没有启用延迟加载,仅加载您明确请求的内容”。EF 上下文永远不会自动进行预加载。试想一下实体和大型数据库之间的许多关联会发生什么。
除非您使用仅访问本地实体的方法,否则您不会从将所有内容预加载到您的上下文中获得太多好处。DbSet.Local
您可以通过或访问本地实体DbSet.Find
。
无论如何,只要访问DbSet
(like context.Customers
) 就会执行数据库查询。如果延迟加载被禁用,它可能会使用本地实体作为导航属性(称为关系修复),但访问导航属性也会导致数据库查询。
听起来您应该使用上下文从数据库中填充对象图,并将其缓存在上下文之外。请注意,如果您以只读方式获取数据,则可能需要使用AsNoTracking
扩展方法。(喜欢context.Customers.AsNoTracking()
)。
不...但是如果您正在寻找将批量数据加载到 EF DbContext 中的最高效方式,我建议您编写一个返回多个结果集(每个实体类型一个)的存储过程。当实体加载到上下文中时,EF 将自动连接导航属性。
以下是关于如何从数据库优先和代码优先的角度进行操作的说明: