3

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

4

1 回答 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 回答