如何在使用基于代码的迁移时停止添加迁移检查我的数据库没有挂起的迁移?

我正在研究使用基于代码的EF迁移来获取使用EF的产品。 一切都运行良好,除了命令:

Add-Migration MyTestMigration 

输出以下消息:

无法生成显式迁移,因为以下显式迁移尚未处理:[201206260845338_DannyTest]。 在尝试生成新的显式迁移之前应用挂起的显式迁移。

原因是连接字符串在构建时是未知的,并且EF在。\ SQLExpress上随机创建了一个名为“MyContextName”的数据库。 我无法应用挂起的迁移,因为它引用了此数据库中不存在的数据库表 – 我们只是尝试使用迁移作为执行脚本的方式;

所以问题是:

  1. 如果我们没有使用自动迁移(我们有EnableAutomaticMigrations = false),为什么Add-Migration要求数据库是最新的, 即使它对生成的(空)迁移没有任何影响 ? 我发现很难相信MS在这么多用法的情况下不打算使用这个用例; 唯一“破碎”的东西是不影响任何行为的validation。

  2. 除了创建我们自己的Add-Migration命令之外还有什么方法可以复制EF的命令,但跳过(看似不必要的)DB最新检查? 我试过传递各种论点,但到目前为止还没有成功。

编辑:

我实际上找到了解决这个问题的更好方法,但它并不是这些问题的真正答案,所以在这里添加它。 希望有时间把它变成博客文章 !

我想使用Add-Migration的唯一原因是因为DbMigration带来的所有guff; 但我意识到,通过基类,我们基本上可以通过让基类从属性自动生成迁移ID来消除所有这一切。 目标对于我们的所有迁移都是相同的,因为模型状态不会改变。 现在,我们只是手动创建这样的迁移(构建ID需要日期,以便EF以正确的顺序应用它们):

 [Migration(2012, 6, 27, 12, 00, "Add new xxx fields for yyy")] internal class MyNewMigration : MyDbMigration { public override Up() { // ... } public override Down() { // ... } } 

MyDbMigration类具有Target / Source / Id属性。 Target是硬编码的(与第一次迁移时创建的Add-Migration相同),Source为null,Id是读取MigrationAttribute的一些reflection。 这意味着我们现在可以手动创建这些类; 这不是很多努力,现在我们不必担心所有的IMigrationMetadata东西:-)

尝试注释掉现有的迁移(未应用于。\ SQLExpress上创建的数据库的迁移)并重新运行您的应用。 这应该使用它需要的初始表填充本地数据库。

一旦本地数据库具有正确的结构,您就应该能够取消对迁移的注释,然后使用update-database使本地数据库更新。 然后,您将能够添加新的迁移。

还要记住update-database命令上有一个-connectionString参数,因此您可以在特定服务器/ db上定位迁移。

直到我从解决方案中删除了包管理器最初创建的原始自动生成的迁移代码之前,我才看到此错误。

在丹尼的情况下,这将是201206260845338_DannyTest.cs。