问题 实体框架启动时间


我想知道是否有可能加快首先使用EF代码进行的第一次查询。

我做了一个小测试程序,其中一个实体包含2个字段,第一个查询需要2.2秒,第二个查询(完全相同)需要0.006秒。

我已经预编译了视图,所以在这里不会有用。 我认为问题是在内存中构建模型需要一些时间,但是它需要花费那么长时间吗?有没有一种方法来预编译这个模型,就像有视图一样?


12154
2018-06-22 13:39


起源

不要以为这是可能的,但我可能错了。查看此问题以了解首次查询期间发生的情况 stackoverflow.com/questions/5634338/... - Raphaël Althaus
@RaphaëlAlthaus你可能是对的:/这很奇怪..你可以使用DbModelBuilder类构建自己的模型,然后在该对象上调用Build方法,因此应该可以在编译时而不是运行时执行此操作..但是也许它只是没有实现。 - nyhjem
检查数据库架构兼容性可能需要一些时间。您可以使用SQL事件探查器进行检查。 - Gert Arnold
这就是我们切换回EDMX的原因。虽然速度不是很快,但肯定比代码先快。代码优先也是检查数据库结构以执行迁移等。普通EDMX立即开始执行查询。 - Akash Kava


答案:


本文: 使用预编译视图的Squash Entity Framework启动时间 详细描述了一个解决方案。

它涉及使用 优化实体数据模型 Entity Framework Power Tools中的选项,用于生成预编译 .Views 类文件。


5
2018-06-22 13:47



我已经试过了,但现在我按照你链接的文章中的步骤进行了操作。视图正在生成,但第一次访问仍然非常慢。我做了一点测试。首先,我使用ordenary SqlConnection和SqlCommand访问数据库。需要0.2秒。在那之后我使用EF并做类似的事情(con.Users.Count();)。这需要3.08秒..!然后我再次运行完全相同的代码行,从现在开始它只需要0.007秒。所以很明显,当你第一次访问数据库时,EF正在做一些事情而不是生成视图。 - nyhjem


当您进行第一次查询时,EF会自行初始化并且需要一些时间。我不认为为了加速EF的基础架构初始化有很多工作要做但是,如果您真正想要的是加快您所做的第一个查询而不是EF的初始化本身,那么,您可以尝试强制EF初始化 之前 运行第一个查询。

        using (var db = new MyContext())
        {
            db.Database.Initialize(force: true);
        }

5
2018-02-28 12:26



force = true会强制重新初始化,即使之前已经初始化了它的infra结构/内部,所以不要使用force:true,除非你改变了连接字符串或表结构。 - Jone Polvora