有什么方法可以加快Entity Framework中的CreateIfNotExists?

时间:2012-09-27 16:50:39

标签: c# sql-server-2008 entity-framework entity-framework-4

我在SQL Server 2008上使用EF 4.3 Code First。我运行了几个使用CreateIfNotExists删除和重新创建数据库的测试套件。这很好,但是狗很慢。在第一次调用时,最多可能需要15秒才能创建数据库,通常需要3-6秒。我有几个地方叫这个。我已经进行了优化,尽可能多地调用它。我能做些什么来以编程方式加速数据库创建?如果有帮助的话,我愿意绕过EF来做这件事,但我想保持我的数据库构建代码而不是回到SQL脚本。谢谢!

1 个答案:

答案 0 :(得分: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数据库的单独连接字符串。