2017-10-20 179 views
0

我在网页开发上遇到EF6问题。在索引页面中,我需要执行一个查询来显示一些信息,问题是第一个查询在内存上创建模型,并花费10秒来完成它(不在很好的托管中)。 人们如何处理这个问题?用直接查询获取第一个数据?读一个txt文件?实体框架6生成模型性能

+2

您可以预先生成EF视图:https://msdn.microsoft.com/en-us/data/dn469601.aspx – Riv

+0

请提供您的查询的代码。 –

+0

@Riv我会尝试预先生成的意见..我之前看到这个选项,但它是一个简单的模型与10个实体和几个关系,它应该默认工作... – Maxi

回答

0

默认情况下,EF具有快照更改跟踪机制。

它每次从数据库加载时都会保存实体状态。例如,当调用SaveChanges方法时,实体框架会检查当前上下文中的所有实体,并将它们与保存的状态进行比较。

这可能是一个触摸有时慢......在上下文构造函数夹头这:

this.Configuration.AutoDetectChangesEnabled = false; 

这将关闭其应该在这里带走了一下开销的实体跟踪。但是,如果它是相当静态的数据,也许你可以在应用程序启动时使用缓存来保存数据,那么你只需要将它从内存中提取出来,并使它每x小时/分钟刷新一次。

而且,顺便说一句,移至AZURE如果可以的话,它不会花费更多的我希望,将是一个更容易一起工作的部署等

0

有两件事情我会做: 1)分析你的查询,看看它是否真的需要10秒。查看LINQPad,Glimpse或Stackify前缀,了解如何查看从EF生成的SQL查询。效率低下的查询可能是您的问题。在数据库中使用视图或设置索引可能会解决问题。

2)如果要运行此查询一次,然后对后续请求使用内存中副本,请使用MemoryCache。第一个请求的性能仍然会受到影响,但只要缓存设置为最后,所有后续请求的速度都会非常快。使用此命令时会产生内存冲击,因为您将结果长期保存在内存中。如果每个访问者在索引页上都有一个动态请求,则会使用大量内存。如果所有用户的请求都是相同的,那么这将是一个不错的选择。