c# - 有什么方法可以加速 Entity Framework 中的 CreateIfNotExists 吗?

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

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

最佳答案

This works fine but is dog slow.

是的。重点是仅将真实数据库用于不必经常执行的集成测试,并且整套集成测试通常仅在构建服务器上执行。

It can take up to 15 seconds to create the database on the first call

这是因为 slow initialization of EF when unit testing (您可以尝试切换到 x86)。 View 生成也消耗了时间。 Views can be pre-generated这通常是为了减少实际系统的启动和初始化,但在使用 View 预生成加速单元测试的情况下不会有太大帮助,因为您只是将时间从测试转移到构建。

I'm willing to go around EF to do this if that helps, but I would like to keep my database build in code and not go back to a 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 数据库。

关于c# - 有什么方法可以加速 Entity Framework 中的 CreateIfNotExists 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12626331/

相关文章:

sql - 为什么在远程表调用上使用 NOLOCK 时需要 WITH?

c# - 如何在多层程序中重新抛出异常?

c# - Linq Where Contains ...保持默认顺序

c# - 注销按钮在 mvc 应用程序中不起作用

c# - 面向对象编程 : Separation of Data and Behavior

c# - WinRT 定时注销

asp.net - Entity Framework 和存储日语文本

sql - 如何在SQL中从字符串中提取某些第n个字符

c# - 哈希 MySql 密码给出 : "Authentication with old password no longer supported, use 4.1 style passwords"

c# - 在 ASP.net 中使用多对多关系