【问题标题】:Any way to speed up CreateIfNotExists in Entity Framework?有什么方法可以加快实体框架中的 CreateIfNotExists?
【发布时间】:2012-09-27 16:50:38
【问题描述】:
我在 SQL Server 2008 上使用 EF 4.3 Code First。我运行了几个测试套件,使用 CreateIfNotExists 删除和重新创建数据库。这工作正常,但狗慢。在第一次调用时创建数据库最多可能需要 15 秒,之后通常需要 3-6 秒。我有几个地方叫这个。我已经优化了尽可能少地调用它。我可以做些什么来以编程方式加快数据库创建速度?如果有帮助,我愿意绕过 EF 来执行此操作,但我想将我的数据库构建在代码中,而不是回到 SQL 脚本。谢谢!
【问题讨论】:
标签:
c#
sql-server-2008
entity-framework
entity-framework-4
【解决方案1】:
这很好用,但速度很慢。
是的。重点是仅将真实数据库用于不需要经常执行的集成测试,并且整套集成测试通常仅在构建服务器上执行。
在第一次调用时创建数据库最多可能需要 15 秒
这是因为slow initialization of EF when unit testing(你可以尝试切换到x86)。时间也被视图生成所消耗。 Views can be pre-generated 这通常是为了减少真实系统的启动和初始化,但在使用视图预生成加速单元测试的情况下不会有太大帮助,因为您只是将时间从测试转移到构建。
如果有帮助,我愿意绕过 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 数据库。