这工作正常,但速度很慢。
是的。要点是仅使用真实数据库进行集成测试,这些测试不必经常执行,并且整套集成测试通常仅在构建服务器上执行。
第一次调用时创建数据库最多可能需要 15 秒
这是因为单元测试时 EF 初始化缓慢 https://stackoverflow.com/questions/12584628/entity-framework-spinup-much-slower-on-x64-vs-x86/12588503#12588503(你可以尝试切换到x86)。视图生成也消耗了时间。视图可以预先生成 https://stackoverflow.com/questions/10757019/entity-framework-initialization-is-slow-what-can-i-do-to-bootstrap-it-faster/10770346#10770346这样做通常是为了减少实际系统的启动和初始化,但如果使用视图预生成加速单元测试,则不会有太大帮助,因为您只是将时间从测试转移到构建。
如果有帮助的话,我愿意绕过 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
数据库。