0

我正在处理实体框架迁移。

当我更改模型并使用 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文件

只有向上()

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

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

第二个cs文件

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

谢谢

4

1 回答 1

0

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

然后,当更改合并到一个分支上时,从外部看,迁移看起来很好——其中一个在项目中一个接一个地出现——但最新的迁移(我们称之为“B”)不包含对先前迁移 ('A') 包含的模型。

调用 update-database 会贯穿所有迁移,并使数据库按预期更新。但是,当添加第三个迁移“C”时,问题就来了。此迁移使用来自“B”的序列化模型状态来了解模型的增量。但是,由于来自“B”的序列化模型不包含“A”表示的更改,迁移“C”然后尝试生成 SQL 语句以涵盖“A”和“C”中的更改。

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

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

于 2013-12-01T13:40:45.117 回答