实体框架6尝试在重命名时删除不存在的索引

时间:2018-01-03 12:47:08

标签: c# entity-framework ef-migrations ef-database-first

作为EF迁移的新手,我对以下行为感到惊讶,并且想知道它是否是故意的(即有一个转换让它消失)。

当我重命名列时,我在EntityTypeConfiguration类中有以下相关行:

Property(x => x.MyColumn).HasColumnName(@"MyColumn").HasColumnType("nvarchar").IsOptional();

而且,至关重要:

HasOptional(a => a.RelatedTable).WithMany(b => b.ThisTable).HasForeignKey(c => c.MyColumn).WillCascadeOnDelete(false);

据我了解,建立外键关系。当我将MyColumn重命名为MyColumn2时,创建的迁移如下所示:

public override void Up()
{
    RenameColumn(table: "dbo.ThisTable", name: "MyColumn", newName: "MyColumn2");
    RenameIndex(table: "dbo.ThisTable", name: "IX_MyColumn", newName: "IX_MyColumn2");
}

但是,MyColumn未在ThisTable上编入索引。我意识到为外键关系创建索引是可取的;这就是为什么EF认为有一个?

请注意,最初使用EF反向POCO生成器从DB生成EF模型。

1 个答案:

答案 0 :(得分:2)

这是有意的。 Code First迁移完全基于模型(数据注释,流畅配置),并假设先前的数据库状态也是使用迁移创建的。由于EF默认约定是为FK列创建索引,因此迁移假定索引存在并尝试重命名。

您可以通过两种方式解决它。编辑生成的迁移并删除RenameIndex(以及其他与索引相关的命令),或关闭(删除)默认的FK索引约定:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
    // ...
}

请注意,后者将影响您将来的模型修改,您必须明确选择FK列的索引(如果实体没有明确的FK属性,则无法执行此操作)。此外,如果您重命名的某些现有FK列具有索引,则您必须手动添加RenameIndex(或DropIndex / CreateIndex`)命令。