2012-03-29 66 views
6

我有我使用DbContext.Database.Create()最近建立了一个数据库的本地实例,所以__MigrationHistory表的InitalCreate条目的代码的时刻匹配存在。让EF4.3代码首先迁移忽略挂起的迁移

一些基于代码的迁移在迁移文件夹中存在,但是。这些将在我们的开发和分期环境中运行,以使这些数据库符合代码。但是,我不需要在本地应用它们,因为我使用当前代码创建了数据库。

我现在需要做出改变的模型,并创建相应的迁移。但是,当我运行Add-Migration TestMigration,我得到以下错误

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

我应该在这种情况下怎么办?我无法将添加迁移工具指向其他环境,因为无法保证版本与本地版本匹配。我想要一个仅匹配我所做更改的迁移。

看来我有几个选择,但没有一个是理想的:

  1. 删除该文件夹迁移其他迁移,运行Add-迁移命令,升级数据库,然后恢复旧的迁移。这很简单,但似乎有点ha。。
  2. 恢复到首次迁移应用到的源代码管理模型的版本,然后构建并使用它创建数据库。然后获取最新版本,应用所有迁移,然后我准备好添加我的迁移。这似乎是一个很大的努力!
  3. 手动创建迁移。

有没有人有关于如何管理这个有什么建议?

回答

2

我已经找到了最佳的工作是非常简单的:一旦你激活不使用DbContext.Database.Create()迁移。如果您想以编程方式创建新数据库,请改用迁移API。

var migrator = new DbMigrator(new Configuration()); 
migrator.Update(); 

那么你已经有了完整的迁移历史和预期进一步增加迁移工作而已。

2

我们计划使用选项#1的变体...

我们的标准作业程序是生成每个迁移SQL脚本(通过更新数据库的-script选项),为了通过InstallShield将SQL脚本应用于最终用户“生产”数据库(我们计划仅将EF update-database用于开发人员数据库)。

因此,我们有两个迁移的.cs文件,并在我们的迁移文件夹中的所有迁移对应的.sql文件。

因此而不是删除从迁移文件夹中的迁移(如你在#1)提出,我们使用SQL管理Studio来手动应用该做插入到_MigrationHistory的.sql文件的只是部分。

这使本地数据库保持最新与那些已经纳入该数据库的变化的_MigrationHistory。

但它是一个杂牌组装电脑,而且我们还在寻找一个更好的解决方案。

DadCat

1

我遇到了同样的问题。 如果运行

Update-database 

,然后运行

Add-Migration YourMigrationName 

这解决了问题

+1

这不起作用,因为以前的迁移操作无法在使用'DbContext.Database.Create()'创建的数据库上运行。想象一下添加一列的迁移,但是在你的新本地数据库中你已经有了这个列,所以你得到一个'SqlException'并且相关的行不会被添加到'__MigrationHistory'表中。看到我的答案,我认为是正确的方法。 – 2013-11-05 15:53:15

1

你要么需要从包管理器控制台运行“update-database”将更改推到数据库,或者你可以从你的迁移文件夹中删除挂起的迁移文件([201203271113060_AddTableX]),然后再运行“添加 - 迁移“根据您的编辑创建全新的迁移。

0

只是从解决方案文件中排除旧的迁移文件。