Entity Framework 6.2 数据库先热身

Entity Framework 6.2 database first warm up

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

这使用 SQL 服务器数据库并且有大约 40 个表和许多外键。

第一次查询很慢,20秒

我立即再次点击相同的页面,更改用户参数,查询时间不到 1 秒。

所以这看起来像是 EF6 中的预热问题。很好,显然我可以做很多事情来分类。

  1. 模型缓存(EF6.2 的一部分)看起来很有用,但我读到的所有内容都首先说明了模型。首先与 DB 无关。这仍然适用于 db first 吗?
  2. 还有 Entity Framework 6 个强大的工具,这些工具允许我生成视图。试过这个,它似乎没有任何区别。这仍然是一条有效的路线吗?
  3. 还有其他想法吗?

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

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

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

所以,答案是将 EF 更新到 6.2,然后使用最新功能:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration() : base()
    {
        var path = Path.GetDirectoryName(this.GetType().Assembly.Location);
        SetModelStore(new DefaultDbModelStore(path));
    }
}

查看全文link:https://entityframework.net/why-first-query-slow

您在启动时性能会受到一些影响,但随后一切都会变得更快。

对于任何使用 Azure 网络应用程序的人,您都可以使用部署槽 (https://stackify.com/azure-deployment-slots/),这允许您发布到非生产槽,然后在将其作为生产槽交换之前对其进行预热。