Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6尝试在重命名时删除不存在的索引_C#_Entity Framework_Entity Framework Migrations_Ef Database First - Fatal编程技术网

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

C# 实体框架6尝试在重命名时删除不存在的索引,c#,entity-framework,entity-framework-migrations,ef-database-first,C#,Entity Framework,Entity Framework Migrations,Ef Database First,作为EF迁移的新手,我对以下行为感到惊讶,并怀疑这是否是故意的(即,有一个开关使其消失) 重命名列时,EntityTypeConfiguration类中有以下相关行: Property(x => x.MyColumn).HasColumnName(@"MyColumn").HasColumnType("nvarchar").IsOptional(); 至关重要的是: HasOptional(a => a.RelatedTable).WithMany(b => b.ThisTa

作为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
未在该表上编制索引。我意识到为外键关系创建索引是可取的;这就是为什么英孚假设有一个


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

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

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<ForeignKeyIndexConvention>();
    // ...
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
// ...
}
请注意,后者将影响您将来的模型修改,您必须显式选择FK列上的索引(如果实体没有显式FK属性,则无法执行此操作)。此外,如果重命名某些具有索引的现有FK列,则必须手动添加
rename索引
(或DropIndex
/
CreateIndex`)命令