相关疑难解决方法(0)

无法在实体框架中生成显式迁移

我正在添加新的迁移,但此消息显示:

无法生成显式迁移,因为以下显式迁移正在等待处理:[201203170856167_left].在尝试生成新的显式迁移之前应用挂起的显式迁移.

谁能帮我?

entity-framework ef-migrations

90
推荐指数
10
解决办法
11万
查看次数

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

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

Add-Migration MyTestMigration
Run Code Online (Sandbox Code Playgroud)

输出以下消息:

由于以下显式迁移未决,因此无法生成显式迁移:[201206260845338_DannyTest].在尝试生成新的显式迁移之前应用挂起的显式迁移.

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

所以问题是:

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

  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()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

MyDbMigration类有目标/来源/标识特性.Target是硬编码的(与第一次迁移时创建的Add-Migration相同),Source为null,Id是读取MigrationAttribute的反射.这意味着我们现在可以手动创建这些类; 现在我们不用担心所有的IMigrationMetadata内容:-)

.net c# entity-framework ef-migrations

7
推荐指数
1
解决办法
8254
查看次数

使EF4.3代码优先迁移忽略挂起的迁移

我有一个我最近使用的数据库的本地实例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工具指向另一个环境,因为它不能保证版本与我本地的版本匹配.我想要一个只与我所做的更改匹配的迁移.

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

  1. 从"迁移"文件夹中删除其他迁移,运行"添加迁移"命令,升级数据库,然后还原旧迁移.这很简单,但似乎有点hackish.
  2. 恢复到应用第一次迁移的源代码管理中的模型版本,然后构建它并使用它来创建数据库.然后获取最新版本,应用所有迁移,然后我就可以添加迁移了.这似乎付出了很多努力!
  3. 手动创建迁移.

有没有人有任何关于如何管理这个的建议?

ef-migrations entity-framework-4.3

6
推荐指数
1
解决办法
6155
查看次数