【问题标题】:Code-First Add-Migration keeps adding the same columnCode-First Add-Migration 不断添加相同的列
【发布时间】:2016-10-11 04:42:15
【问题描述】:

除其他外,我的模型包含两个属性,这些属性在初始创建和迁移后添加到模型类中。

public sealed class SomeModel
{
    ... other properties, which are fine.        
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

我最近的迁移包含:

public override void Up()
{
    ... other table being created.
    AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
    AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}

目标数据库包含PropertyOnePropertyTwo 列,__MigrationHistory 表包含创建表的迁移和添加列的迁移的条目。

当我运行Add-Migration 进行其他更改时,它还再次包含这两个属性:

public override void Up()
{
    ... other changes.
    AddColumn("dbo.SomeModel", "PropertyOne", c => c.Int(nullable: false));
    AddColumn("dbo.SomeModel", "PropertyTwo", c => c.Int(nullable: false));
}

这可能是什么原因造成的?我还注意到,如果我恢复所有模型更改并尝试Update-Database(应该什么都不做),我会收到错误:

无法更新数据库以匹配当前模型,因为有 挂起的更改和自动迁移被禁用。要么写 待定模型更改为基于代码的迁移或启用自动 移民。将 DbMigrationsConfiguration.AutomaticMigrationsEnabled 设置为 true 启用自动迁移。

可能是什么原因造成的?

【问题讨论】:

    标签: .net entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    事实证明,在与您的迁移关联的 .designer.cs 类中有一个隐藏的模型快照。 (这是IMigrationMetadata.Target,不是人类可读的。)导致问题的一系列步骤是:

    1. 对模型进行更改。
    2. 运行Add-Migration 为更改创建迁移。 (这会创建隐藏的 IMigrationMetadata.Target 值。)
    3. 注意到迁移建模方式存在错误,直接更改模型类和迁移类。 (IMigrationMetadata.Target 值现在不同步了。)
    4. 运行 Update-Database 以应用更改。

    要摆脱混乱,请使用Add-Migration Dummy 创建一个虚拟迁移,然后从Up()Down() 方法中删除所有内容。

    请注意,Add-Migration 确实会就此发出警告;当你运行Add-Migration 时,它会显示:

    此迁移文件的设计器代码包含您的快照 当前的 Code First 模型。此快照用于计算 下一次迁移时对模型的更改。如果你 对您想要包含在此中的模型进行其他更改 迁移,然后您可以通过运行“添加迁移”来重新构建它 又是假人。

    在我弄清楚问题所在并看到隐藏的 IMigrationMetadata.Target 值之前,警告没有任何意义。

    底线:不要手动保持模型和迁移Up() 方法同步;您必须重新运行Add-Migration 才能正确设置隐藏值。

    【讨论】:

    • 优秀的答案;很难找到。感谢发帖。
    • 仅供参考:资源文件中的 Target 数据是一个 bas64 编码、gzip 压缩的 edmx (xml) 文件。
    • 感谢您提供此信息。这当然解释了为什么当您需要修改关系并且无法理解为什么它会在迁移中做一些事情时,EF 会如此难以使用。放弃代码优先迁移越来越有吸引力:)
    • @mattpm,FWIW,我不仅放弃了代码优先迁移,而且完全放弃了 EF,我很喜欢它。 “易于开发”在很大程度上难以捉摸,我厌倦了正在发生的难以调试的“魔法”和生成的蹩脚的 SQL。我发现轻量级 ORM(例如 Dapper)取得了更大的成功。 YMMV。
    • @wischi 这个神奇的 Taget 文件在哪里?我已经删除了所有内容,我的 Add-Migration 仍然神奇地在某处有缓存。
    【解决方案2】:
    1. 将迁移代码复制到记事本或一些文本编辑器中
    2. 删除不起作用的问题迁移
    3. Add-Migration YourMigrationName
    4. 粘贴保存在文本编辑器中的迁移代码
    5. Update-Database

    在我看来,这是一种丑陋的解决方法,但这是我发现的唯一方法,可以确保我的迁移包含其中的所有更改。我的猜测是 Entity Framework 在一定时间后会使迁移过时,因此您必须创建一个新的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2017-09-29
      • 2021-06-10
      相关资源
      最近更新 更多