我在 SQL Server 2008 上使用 EF 4.3 Code First。我运行了几个测试套件,使用 CreateIfNotExists 删除和重新创建数据库。这工作正常,但狗慢。在第一次调用时创建数据库最多可能需要 15 秒,之后通常需要 3-6 秒。我有几个地方叫这个。我已经优化了尽可能少地调用它。我可以做些什么来以编程方式加快数据库创建速度?如果有帮助,我愿意绕过 EF 来执行此操作,但我想将我的数据库构建在代码中,而不是返回到 SQL 脚本。谢谢!
问问题
886 次
1 回答
1
这工作正常,但狗慢。
是的。关键是仅将真实数据库用于不需要经常执行的集成测试,并且整套集成测试通常仅在构建服务器上执行。
在第一次调用时创建数据库最多可能需要 15 秒
这是因为单元测试时EF初始化缓慢(可以尝试切换到x86)。时间也被视图生成所消耗。可以预先生成视图,这通常是为了减少实际系统的启动和初始化,但在加速单元测试的情况下,使用视图预生成不会有太大帮助,因为您只是将时间从测试转移到构建。
如果有帮助,我愿意绕过 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
数据库。
于 2012-09-28T09:00:11.980 回答