首页 > 解决方案 > Entity Framework 6.2 数据库先预热

问题描述

我的 MVC 解决方案中有一个 EF 6.2 项目。

这使用了一个 SQL 服务器数据库,并且有大约 40 个带有许多外键的表。

第一个查询很慢,20 秒。

我立即再次访问同一页面,更改了用户参数,查询时间不到 1 秒。

所以这看起来像是 EF6 中的一个热身问题。没关系,我可以做很多事情来进行排序。

  1. 模型缓存(EF6.2 的一部分)看起来可能是有益的,但在我读到它的任何地方都首先声明模型。首先与DB无关。这仍然可以首先与 db 一起使用吗?
  2. 还有 Entity Framework 6 电动工具,这些允许我生成视图。试过这个,它似乎没有任何区别。这仍然是一条有效的路线吗?
  3. 还有其他想法吗?

标签: sql-serverentity-frameworkwarm-up

解决方案


EF DbContexts 会产生一次性成本来解析其实体映射。对于 Web 应用程序,您可以通过让应用程序启动启动针对 DbContext 的简单查询来缓解这种情况,该查询“启动”此预热,而不是在您的第一个用户触发查询期间。简单地新建一个上下文不会触发初始化,运行查询会。所以对于 ASP.Net MVC 上的Application_Start,在初始化一切之后:

using (var context = new MyContext())
{
   var warmup = context.MyTable.Count(); // against a small table.
}

OnModelCreating您可以通过使用一组从 DbContext 读取数据的定时测试并在 DbContext 的事件中放置一个断点来使用单元测试来测试此行为。它将在第一个查询的第一个测试中执行一次。您可以OneTimeSetUp使用上述快速计数示例在测试夹具设置中添加一个以在测试之前运行以在测量测试运行的性能之前产生此成本。


推荐阅读