Entity framework 添加显示以前更改的迁移

Entity framework 添加显示以前更改的迁移,entity-framework,Entity Framework,我正在进行实体框架迁移 当我更改模型并使用add migration时,它工作正常,但当我第二次更改模型并运行add migration命令时,生成的文件包含我第一次和第二次进行的sql更改 谁能告诉我为什么我会有这种行为 这是模型 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Department>().Property

我正在进行实体框架迁移

当我更改模型并使用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; }
}
 }
当我试图通过添加[required]注释将EMPName更改为required时,生成的文件如下所示

第二个cs文件

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

谢谢

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

然后,当这些更改合并到一个分支上时,迁移从外部看起来很好-其中一个在项目中紧随其后-但是最新的迁移(我们称之为“B”)不包含前面迁移(“a”)包含的对模型的更改

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

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


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

在添加迁移后,您是否正在执行
更新数据库
?是..我正在执行更新数据库发布您的模型并且migration.cs-s生成了—或者更新时生成的任何SQL—就像一小步一小步—所以我们可以看到发生了什么,很难说一句话。同时检查您的连接(尽管我对此表示怀疑)删除旧的
迁移
,它将解决您的问题。这正是我不运行
addmigrations
的原因,特别是如果我首先遵循
ef-code
     AddColumn("dbo.Departments", "ColChanged", c => c.String());
    AlterColumn("dbo.Employees", "EmpName", c => c.String(nullable: false));