代码优先添加迁移不断添加相同的列

时间:2014-08-21 16:40:17

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

我的模型包含两个在初始创建和迁移后添加到模型类中的属性。

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。

可能导致此问题的原因是什么?

2 个答案:

答案 0 :(得分:9)

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

  1. 创建模型的更改。
  2. 运行Add-Migration以创建更改的迁移。 (这会创建隐藏的IMigrationMetadata.Target值。)
  3. 注意到迁移建模方式存在错误,请直接更改模型类和迁移类。 (IMigrationMetadata.Target值现在不同步。)
  4. 运行Update-Database以应用更改。
  5. 要摆脱困境,请使用Add-Migration Dummy创建虚拟迁移,然后从Up()Down()方法中删除所有内容。

    请注意,Add-Migration会对此发出警告;当您运行Add-Migration时,它会显示:

      

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

    在我弄清问题是什么之前,这个警告没有任何意义,并且看到了隐藏的IMigrationMetadata.Target值。

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

答案 1 :(得分:0)

  1. 将迁移代码复制到记事本或某些文本编辑器
  2. 删除无效的问题迁移
  3. Add-Migration YourMigrationName
  4. 粘贴在文本编辑器中保存的迁移代码
  5. Update-Database
  6. 在我看来,这是一种丑陋的工作,但这是我发现的唯一方法,以确保我的迁移具有所有的变化。我的猜测是实体框架在一段时间后使迁移过时,因此您必须创建一个新的。