请问我理解正确了吗。
当您运行 Web 应用程序以查看页面并创建上下文实例时,该实例会将所有数据库日期加载到其中吗?
如果确实如此,那么一个拥有五年博客的博客可能不会占用太多内存,其中可能包含 1,500 到 2,000 条(或更多)帖子,其中包含所有评论标签等,这将是大量数据。
那么当你创建一个上下文的实例时会发生什么呢?
请问我理解正确了吗。
当您运行 Web 应用程序以查看页面并创建上下文实例时,该实例会将所有数据库日期加载到其中吗?
如果确实如此,那么一个拥有五年博客的博客可能不会占用太多内存,其中可能包含 1,500 到 2,000 条(或更多)帖子,其中包含所有评论标签等,这将是大量数据。
那么当你创建一个上下文的实例时会发生什么呢?
上下文仅加载您请求的记录,因此当您第一次实例化一个记录时,它将为空,并且在您告诉它之前不会对数据库执行任何查询。但是,您通过它加载的任何实体(通常)都将被缓存在上下文中,因此每次运行查询时它们都会使用越来越多的内存,并且随着时间的推移会变得非常大。
出于这个原因,并且因为上下文的实例化相对便宜,所以最好只在您真正需要它们时让它们保持活动状态,并在完成后立即处理它们。这是“工作单元”模式的一部分——基本上为作为一个单元或事务组合在一起的每组操作使用一个新的上下文。
编辑添加:
如果您正在执行只读查询(即您只想显示数据,您不需要进行更改并将它们保存回数据库),您可能会检查非跟踪查询(例如,.AsNoTracking()
如果您的方法'重新使用DbContext
/ DbSet
,或者MergeOption.NoTracking
如果您使用ObjectContext
/则使用属性ObjectSet
) - 这将避免在上下文中缓存结果,提高性能并减少内存使用。