添加迁移显示以前的更改

时间:2013-04-04 09:53:35

标签: entity-framework

我正在进行实体框架迁移。

当我更改模型并使用add-migration时它的工作正常,但是当我第二次更改我的模型并运行add-migration命令时,生成的文件包含我第一次和第二次更改的sql。

任何人都可以告诉我为什么我有这种行为。

这是模型

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Department>().Property(p => p.NewCol2).HasColumnName("ColChanged");
    }

public class Department
{
    public int DeptId { get; set; }
    public int DivNo { get; set; }
    public string DeptName { get; set; }
public string NewCol2 { get; set; }

    public List<Employee> Employees { get; set; }
}

public class Employee
{

    public int EmpNo { get; set; }
    public int DivisionNo { get; set; }
    public int DeptId { get; set; }
    public string EmpName { get; set; }

    public Department Department { get; set; }
}
 }

我想将NewCol2名称更改为ColChange,我在ModelBuilder中编写了该属性,并获得了生成的文件,如下所示。

第一个cs文件

只有Up()

 AddColumn("dbo.Departments", "ColChanged", c => c.String());

当我尝试通过添加[必需]注释将EMPName更改为必需时,我获得了生成的文件,如下所示

第二个cs文件

     AddColumn("dbo.Departments", "ColChanged", c => c.String());
    AlterColumn("dbo.Employees", "EmpName", c => c.String(nullable: false));

谢谢

1 个答案:

答案 0 :(得分:0)

我见过的一个地方就是你在一个协作环境中工作,两个人在独立分支上添加迁移。这两个迁移都将模型的状态序列化到它们的__MigrationHistory表条目(这是存储在迁移的resx文件中的条目)。

然后,当更改合并到一个分支上时,迁移从外部看起来很好 - 其中一个在项目中另一个之后 - 但是最新的迁移(让我们称之为'B')不包含上一次迁移('A')包含的模型更改。

调用update-database会运行所有迁移,并使数据库按预期更新。但是,当添加第三次迁移“C”时会出现问题。此迁移使用“B”中的序列化模型状态来理解模型的增量。但是,由于'B'中的序列化模型不包含'A'表示的更改,因此迁移'C'会尝试生成SQL语句以覆盖'A'和'C'中的更改。

解决方法是返回迁移'A',删除'B'和'C'并确保数据库处于仅应用'A'的状态。然后添加迁移以创建一个覆盖'B'和'C'。

为了防止将来发生这种情况,如果他们发现他们刚刚合并了其他人的迁移,则应该将代码集成到其分支中的人员负责删除并重新创建他们的迁移。