我正在添加新的迁移,但此消息显示:
无法生成显式迁移,因为以下显式迁移正在等待处理:[201203170856167_left].在尝试生成新的显式迁移之前应用挂起的显式迁移.
谁能帮我?
我正在研究使用基于代码的EF迁移来获取不使用EF的产品.一切都运行良好,除了命令:
Add-Migration MyTestMigration
Run Code Online (Sandbox Code Playgroud)
输出以下消息:
由于以下显式迁移未决,因此无法生成显式迁移:[201206260845338_DannyTest].在尝试生成新的显式迁移之前应用挂起的显式迁移.
原因是连接字符串在构建时是未知的,并且EF在.\ SQLExpress上随机创建了一个名为"MyContextName"的数据库.我无法应用挂起的迁移,因为它引用了此数据库中不存在的数据库表 - 我们只是尝试使用迁移作为执行脚本的方式;
所以问题是:
如果我们没有使用自动迁移(我们有EnableAutomaticMigrations = false),为什么Add-Migration要求数据库是最新的,即使它对生成的(空)迁移没有任何影响?我发现很难相信MS在这么多用法的情况下不打算使用这个用例; 唯一"破碎"的东西是不影响任何行为的验证.
除了创建我们自己的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()
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
本MyDbMigration类有目标/来源/标识特性.Target是硬编码的(与第一次迁移时创建的Add-Migration相同),Source为null,Id是读取MigrationAttribute的反射.这意味着我们现在可以手动创建这些类; 现在我们不用担心所有的IMigrationMetadata内容:-)
我有一个我最近使用的数据库的本地实例DbContext.Database.Create(),因此该__MigrationHistory表存在一个InitalCreate与当前代码匹配的条目.
但是,迁移文件夹中存在一些基于代码的迁移.这些将在我们的开发和登台环境中运行,以使这些数据库与代码保持一致.但是,我不需要在本地应用它们,因为我使用当前代码创建了数据库.
我现在需要对模型进行更改并创建相应的迁移.但是当我跑步时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.
Run Code Online (Sandbox Code Playgroud)
在这种情况下我该怎么办?我不能将Add-Migration工具指向另一个环境,因为它不能保证版本与我本地的版本匹配.我想要一个只与我所做的更改匹配的迁移.
看来我有几个选择,但没有一个是理想的:
有没有人有任何关于如何管理这个的建议?