Entity Framework 6在重命名时尝试删除不存在的索引

4
作为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");
}

然而,在ThisTable中,MyColumn并没有被索引。我意识到为外键关系创建索引是明智的;这就是为什么EF认为存在外键关系的原因吗?

请注意,EF模型最初是使用EF Reverse POCO Generator从数据库生成的。

1个回答

3

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

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

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

请注意,后者将影响您未来的模型修改,并且您必须明确选择在FK列上创建索引(如果实体没有显式FK属性,则无法完成此操作)。另外,如果您重命名一些已经有索引的FK列,则需要手动添加RenameIndex(或DropIndex/CreateIndex)命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接