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