有什么办法可以加快实体框架中的 CreateIfNotExists 速度?

2024-03-06

我在 SQL Server 2008 上使用 EF 4.3 Code First。我运行了几个测试套件,这些测试套件使用 CreateIfNotExists 删除并重新创建数据库。这工作正常,但速度很慢。第一次调用时创建数据库最多可能需要 15 秒,之后通常需要 3-6 秒。我有好几个地方都这么称呼。我已经优化为尽可能少地调用它。我可以做些什么来以编程方式加快数据库创建速度吗?如果有帮助的话,我愿意绕过 EF 来执行此操作,但我希望将数据库构建保留在代码中,而不是返回到 SQL 脚本。谢谢!


这工作正常,但速度很慢。

是的。要点是仅使用真实数据库进行集成测试,这些测试不必经常执行,并且整套集成测试通常仅在构建服务器上执行。

第一次调用时创建数据库最多可能需要 15 秒

这是因为单元测试时 EF 初始化缓慢 https://stackoverflow.com/questions/12584628/entity-framework-spinup-much-slower-on-x64-vs-x86/12588503#12588503(你可以尝试切换到x86)。视图生成也消耗了时间。视图可以预先生成 https://stackoverflow.com/questions/10757019/entity-framework-initialization-is-slow-what-can-i-do-to-bootstrap-it-faster/10770346#10770346这样做通常是为了减少实际系统的启动和初始化,但如果使用视图预生成加速单元测试,则不会有太大帮助,因为您只是将时间从测试转移到构建。

如果有帮助的话,我愿意绕过 EF 来做到这一点,但我想保留我的数据库构建在代码中,而不是回到 SQL

四处走动只意味着使用普通的旧 SQL 脚本。此操作所需的额外时间可能会花费在生成该 SQL 上。我认为 SQL 不会被缓存,因为正常的应用程序执行通常不会多次需要它,但您可以要求 EF 至少为您提供该 SQL 的最重要部分,将其缓存在某处并在每次需要时自行执行。 EF 能够为您提供表和约束的 SQL:

var dbSql = ((IObjectContextAdapter) context).ObjectContext.CreateDatabaseScript();

您只需要拥有自己的小 SQL 来创建数据库并一起使用它们。即使像下面的脚本这样的东西也应该足够了:

CREATE DATABASE YourDatabaseName

USE YourDatabaseName

您还必须首先在代码中关闭数据库生成才能使其工作并控制该过程:

Database.SetInitializer<YourContextType>(null);

当执行数据库创建 SQL 时,您将需要单独的连接字符串指向Master数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有什么办法可以加快实体框架中的 CreateIfNotExists 速度? 的相关文章

随机推荐