Entity Framework 启动时间

11

我想知道在使用EF Code First进行第一次查询时是否可能加快速度。

我已经创建了一个包含2个字段的实体的小型测试程序,第一次查询需要2.2秒,而第二个查询(完全相同)只需要0.006秒。

我已经预编译了视图,所以这里无法帮助。我认为问题在于构建内存中的模型需要一些时间,但是它应该需要那么长时间吗?是否有一种方法可以像视图那样预编译此模型?


1
不认为这是可能的,但我可能是错的。查看此问题以了解第一个查询期间发生了什么情况https://dev59.com/41bTa4cB1Zd3GeqP7yK2 - Raphaël Althaus
@RaphaëlAlthaus 你可能是对的 :/ 这很奇怪.. 你可以使用 DbModelBuilder 类构建自己的模型,然后在该对象上调用 Build 方法,因此应该可以在编译时而不是运行时执行此操作.. 但也许它只是没有被实现。 - nyhjem
检查数据库架构兼容性可能需要一些时间。您可以使用SQL分析器来进行检查。 - Gert Arnold
1
这就是我们回到使用EDMX的原因。尽管它不是非常快,但肯定比Code First更快。Code First还要检查数据库结构以执行迁移等操作。而纯粹的EDMX立即开始执行查询。 - Akash Kava
2个回答

5

4
我已经尝试过那个方法,但现在我按照你提供的文章中的步骤进行了操作。 视图已经生成,但是第一次访问仍然非常慢。 我做了一个小测试。首先我使用普通的SqlConnection和SqlCommand访问数据库,只需0.2秒。紧接着我使用EF并执行类似的操作(con.Users.Count();)。这需要3.08秒..!然后我再次运行完全相同的代码行,从现在开始,它只需要0.007秒.. 因此,很明显EF在初次访问数据库时除了生成视图之外还在做其他事情。 - nyhjem

5

当你进行第一次查询时,EF会初始化自己,这需要一些时间。我认为在加快EF的基础设施初始化方面没有太多可以做的,但是如果你真正在寻求的是加快你进行的第一个查询而不是EF本身的初始化,那么你可以尝试强制EF在运行你的第一个查询之前进行初始化。

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

3
force=true将强制重新初始化基础设施/内部结构,即使它之前已经被初始化过了,因此除非你已经更改了连接字符串或表结构,否则不要使用force:true。 - Jone Polvora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接